Как удалить файл, используемый другим процессом

Вот сделка.

Мой WinApp работает, верно? скажем, процесс "A". Он создает файл и сохраняет дескриптор (держит файл открытым для записи, это необходимо).
Затем он запускает другой процесс msbuild, назовем его "B". Этот процесс запускается с помощью класса System.Diagnostic.Process.
В какой-то момент мой WinApp (A) должен удалить ранее созданный файл (помните, что он был создан самим A), и именно тогда я получаю IOException с сообщением "Процесс не может получить доступ к файлу" X ", потому что он используется другим процессом ". И это действительно так!... Если я завершу процесс 'B', только тогда 'A' сможет успешно удалить файл.

Итак, мои вопросы:
1) Есть ли способ, которым я могу сказать процесс, который я создаю, не обрабатывая файлы, которые я открыл?
2) Есть ли другой способ реализовать мой сценарий?

4 ответа

Решение

Это выглядит как System.Diagnostic.Process.Start calls CreateProcess with the bInheritHandles аргумент установлен в true,

Вы можете попробовать установить UseShellExecute to true in ProcessStartInfo, or directly P/Invoke to CreateProcess,

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

Эта программа добавляет значения реестра в ключ HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations, который Windows проверяет при загрузке, и это гарантирует удаление файла, хотя и не сразу.

Можно принудительно закрыть дескриптор файла, не закрывая процесс, использующий дескриптор, хотя это может привести к сбою приложения. Другими словами, выполнение того, что вы хотите сделать, может привести к сбою "B". Тем не менее, то, что вы запрашиваете, определенно возможно, так как приложение, Process Explorer может сделать это. Если вы ищите доску объявлений по этой ссылке, вы можете найти ее информативной, хотя даже поиск того, какое приложение использует дескриптор, - это разочарование, не говоря уже о закрытии дескриптора.

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

Я пытался сделать это с помощью:

FileStream exclusiveWriter = new FileStream(@"C:\Temp\FileLockTest1.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);  

Полное обсуждение доступно по адресу:

Файл заблокирован исключительно другим процессом - MSDN Forum disucssion

Надеюсь это поможет.

Другие вопросы по тегам