2016-08-19 3 views
1

Есть несколько потоков на SO, которые описывают, как проверить, какое приложение создает файл с такими инструментами, как монитор процессов Sysinternals. Что-то вроде этого возможно программно из .net?Как программно определить, какой процесс создал файл в .net?

фон: Моя программа должна дистанционно управлять собственным приложением третьей стороны, используя его интерфейс автоматизации, и одна из функций, мне нужно из этого приложения есть ошибка, где он создает кучу временных файлов в %TEMP%, которые называются tmpXXXX.tmp (то же, что и .net Path.GetTempFileName()), но не удаляет их. Это приводит к тому, что накопитель C становится полным с течением времени, что в конечном итоге приводит к отказу приложения. Я уже подал ошибку производителю, но пока нам нужно временное обходное решение, поэтому я подумал о том, чтобы поставить FileSystemWatcher на %TEMP%, который смотрит tmp*.tmp, собирает эти файлы и после завершения операции над сторонним приложением удаляет их. Но это рискованно, так как другое приложение может также записывать файлы с одинаковым шаблоном имени файла в %TEMP%, поэтому я хочу только удалить те, которые были созданы NastyBuggyThirdPartyApplication.exe.

Это так или иначе возможно?

+0

Я знаю, как вы можете определить, какой файл открыт, но нет, если его сейчас закрыто ...... – BugFinder

+0

Возможный wrokaround: Если вы можете запустить программу под пользовательской учетной записью пользователя, то вы можете просто проверить владельца файлов. – HugoRune

+0

В файле, который содержит информацию, которую вы ищете, нет ничего. Вы либо должны «быть там», когда файл создается, и отслеживать соответствующее приложение (ы), или вам нужно прибегнуть к обману, например, к вышеупомянутой учетной записи пользователя. –

ответ

0

Такие вещи возможны, но, может быть, немного сложнее.

  1. Чтобы узнать, кто создал этот файл, ознакомьтесь с пользователем, которым он принадлежит. Поэтому вам может потребоваться создать определенного пользователя, и это приложение будет запущено под этим конкретным пользователем. Чтобы сделать это, вам нужно создать небольшое приложение, которое запустит ваше багги-приложение, олицетворяя другого пользователя, поэтому все, что делается в приложении, будет находиться под этим пользователем, так как создается файл ...

  2. Я не знаю, t знать, как контролировать и запускаться при создании файла, но ничто не мешает вам устанавливать таймер, который просыпается каждые пять или десять минут, а затем проверяет, принадлежит ли какой-либо файл в каталоге пользователю приложения и закрыт, поэтому он удаляет его.

  3. Возможно, если они быстро отреагируют на эту ошибку, вам не понадобится ваше приложение очень долгое время. Таким образом, еще одно решение, если это возможно может просто изменить папку Temp на другой диск, который имеет много места ...

+0

В настоящее время я перехожу на вариант 3, потому что создание другого пользователя в этой системе не так просто. Это система, управляющая связкой измерительного оборудования и нуждающаяся в особой конфигурации. Пользователи и группы обрабатываются доменом, и я не хочу рисковать что-то менять там. Тем не менее, я видел шаблон за файлами, которые использует только это специальное приложение, поскольку файлы находятся в собственном проприетарном формате. Поэтому я просто проверяю, содержат ли файлы определенные вещи в определенных положениях, чтобы они могли указать, что нужно удалить. – rabejens

0

Одним из решений является то, что вы используете FileWatcher автоматически удалить все файлы, но перед удалением вас должен проверить, не заблокирован ли файл в данный момент или используется другим процессом, например, Sysinternal Suite имеет инструмент handle.exe, который может это сделать. Используйте его из командной строки:

Handle.exe -a

Вы можете вызвать это из C# программы (там могут быть некоторые проблемы с производительностью, хотя)

Так что вы могли бы сделать, это когда файл вы подтверждаете, что он используется или заблокирован (например, вы можете использовать код, указанный в Is there a way to check if a file is in use?), а затем удалить его.

В большинстве случаев, когда приложение использует временный файл, оно блокирует его, чтобы предотвратить то, что вы боитесь, что вы можете удалять файлы из других процессов.

Насколько я могу судить, нет надежного способа определить, какой процесс создал конкретный файл.

 Смежные вопросы

  • Нет связанных вопросов^_^