Как удалить файл, используемый другим процессом - PullRequest
0 голосов
/ 18 декабря 2008

Вот сделка.

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

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

Ответы [ 4 ]

2 голосов
/ 18 декабря 2008

Похоже, что System.Diagnostic.Process.Start вызывает CreateProcess с аргументом bInheritHandles, установленным в true.

Вы можете попробовать установить UseShellExecute в значение true в ProcessStartInfo или непосредственно P / Invoke в CreateProcess.

0 голосов
/ 18 декабря 2008

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

Я пытался сделать это, используя:

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

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

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

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

0 голосов
/ 18 декабря 2008

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

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

0 голосов
/ 18 декабря 2008

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

...