2011-01-04 3 views
1

Я искал множество примеров, но никто не работает идеально для меня. Я использую C#.Как определить файл используется?

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

Метод примерки поймать File.Open (...) работает только для определенных типов файлов, как DOC, XLS, PPT, PDF, mp3 и т.д., но не работает на .txt, застежка-молния, HTML и т.д. ...

+0

возможно дубликат [C#: есть ли способ, чтобы проверить если файл используется?] (http://stackoverflow.com/questions/876473/c-is-there-a-way-to-check-if-a-file-is-in-use) –

ответ

11

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

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

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

+0

Я понимаю логику, спасибо за ваше объяснение. Теперь я могу использовать таймер для удаления файла со старейшим «Last Access Time». – VHanded

+0

На самом деле это не будет работать ни в операционных системах, где последнее время доступа не включено. Последнее время доступа может быть отключено в Windows XP и по умолчанию отключено в Vista и Windows 7. – Josh

+0

oh? Спасибо, что напомнили. Изменит его. – VHanded

0

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

0

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

0

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

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

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

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

+1

это не сработает для определенных приложений, таких как блокнот и т. Д., Который не применяется к файлу. – VHanded

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