Как я могу удалить файл, который используется другим процессом? - PullRequest
9 голосов
/ 08 марта 2011

При попытке удаления файла возникает следующее исключение:

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

Мой код выглядит так:

string[] files = Directory.GetFiles(@"C:\SEDocumentConverter\SOURCE");
foreach (string file in files)
{               
   File.Delete(file);
}

Как я могу решить эту проблему?

Ответы [ 6 ]

7 голосов
/ 08 марта 2011

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

Если вы еще не знаете, какая это программа, вы можете выяснить это, используя Обрабатывать или Process Explorer .

4 голосов
/ 08 марта 2011

Вы можете P / вызвать Windows MoveFileEx и использовать флаг MOVEFILE_DELAY_UNTIL_REBOOT с пустым именем назначения. Это удалит файл при перезагрузке.

0 голосов
/ 08 февраля 2013

Другой способ - найти все открытые дескрипторы файла и принудительно закрыть их.

Работает хорошо для вас, плохо для любых приложений, которые использовали файл.

Можно попробовать в пользовательском интерфейсе с SysInternals ProcessExplorer.

0 голосов
/ 08 февраля 2013

Просто переименуйте этот файл.Это подойдет тем, кто пытается написать в это место.

Примечания:

1) Конечно, файл еще не удален физически.Хорошо бы выполнить трюк MoveFileEx, упомянутый здесь, чтобы завершить работу.

2) Если вы хотите удалить заблокированный файл, чтобы записать что-то новое вместо него (например, во время сборки), просто переименуйте файл вимя GUID.Если вам нужна чистая папка, используйте игнорируемое расширение / скрытый атрибут или переименуйте файл по пути в %TEMP% (если на том же диске).

3) Не все заблокированные файлы могутбыть переименован, но это работает для меня как 90% практических приложений.Вы можете переместить файл, не влияя на открытый дескриптор чтения / записи / выполнения, он будет продолжать работать с перемещенным файлом просто хорошо (если, конечно, перемещен в том же томе NTFS).

4) Это то, что установщик WindowsВ основном это делается до того, как он попросит вас перезагрузиться, когда-нибудь в ближайшее время: уберите файл с глаз, запланируйте удаление после перезагрузки.Обычно недавно установленное приложение можно использовать сразу.

Практическое использование:

Мой любимый вариант с MSBuild.Переопределение задачи <Copy/> с этим материалом заставляет всю сборку идти в Linux.Вам все равно, если предыдущая версия все еще работает где-то, вы все равно можете ее собрать и запустить.Старое приложение продолжает использовать старую версию файлов.Новое приложение загружает только что написанную версию.

Возможно, переместится на %TEMP%, если находится на том же диске (но не в моем случае).Я бы просто переименовал их в расширение, которое игнорируется текущим клиентом контроля версий.

0 голосов
/ 08 марта 2011

немного не по теме: но из вашего кода видно, что вы пытаетесь удалить все файлы вашей папки. Ну, вместо того, чтобы удалять их по одному, у нас есть другой метод Directory.Delete (path, True), который удалит каталог, содержащийся в строке с именем path. Затем вы можете восстановить каталог, если хотите. Но ваша проблема может сохраняться и здесь.

0 голосов
/ 08 марта 2011

Если файл используется, вам не повезло в попытке удалить его. На основании вашего кода я не могу сказать вам, какой процесс может использовать файлы, но попробуйте поискать здесь или здесь или здесь , или в любые другие вопросы, которые отображаются как относящиеся к этому вопросу в качестве руководства по данной проблеме, и непременно следуйте указаниям @Cody Grey по использованию Process Explorer.

...