Как определить, используется ли файл? - PullRequest
1 голос
/ 04 января 2011

Я искал много примеров, но ни один из них не подходит для меня. Я использую C #.

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

Метод try-catch File.Open (...) работает только для определенных типов файлов, таких как doc, xls, ppt, pdf, mp3 и т. Д., Но не работает для txt, zip, html и т. Д ...

Ответы [ 4 ]

11 голосов
/ 04 января 2011

Поведение, которое вы видите, не имеет ничего общего с расширением или содержимым файла. Это связано с тем, как связанные приложения обрабатывают эти файлы. Например, Блокнот, Internet Explorer и т. Д. Не будут блокировать открытый файл после прочтения содержимого. Вот почему .txt и .html файлы могут быть открыты.

Microsoft Office, практически все медиаплееры и т. Д. Будут блокировать файл. В случае с Office это делается для того, чтобы другие программы не удаляли и не удаляли файл из-под него. В случае медиа-плеера файлы обычно слишком велики, чтобы их можно было полностью прочитать в память. Вот почему эти типы файлов заблокированы при использовании.

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

0 голосов
/ 04 января 2011

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

try
{
    File.Delete(path);
}
catch(Exception e)
{
// ignore ... or whatever action
}

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

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

0 голосов
/ 04 января 2011

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

0 голосов
/ 04 января 2011

Открыть файл в двоичном режиме File.Open (...) будет работать для всех файлов.

...