2011-02-10 4 views
0

Я создал функцию очистки файлов, используя мониторинг работоспособности. Он удаляет файл, который не имеет доступа к другому процессу. Итак, я хочу проверить это. Остается ли он. Если доступ отсутствует, я удаляю этот файл. Как я могу сделать?Как узнать, что файл используется или нет в asp.net

+3

ОШИБКА: ЭТОТ ФАЙЛ ИСПОЛЬЗУЕТ ГЕРОИН (asp.net) –

+0

Вы имеете в виду «Как узнать, используется ли файл (другим процессом) из приложения asp.net?» =) – Rob

+1

Я ценю английский, вероятно, не вы первый язык, но, поскольку он стоит, вы сомневаетесь, что это не имеет большого смысла. Вы спрашиваете, можете ли вы указать, является ли файл частью приложения asp.net или если к файлу обращается приложение asp.net? –

ответ

2

Одна вещь, которую вы можете сделать, вместо того, чтобы проверить, если файл заблокирован (как это может измениться в период между проверкой и попытке удаления) является завернуть удаления попытки в блоке try/catch:

Dim filenameToDelete = "AFileThatsInuse.doc" 
Try 
    System.IO.File.Delete(filenameToDelete) 
Catch ex As IOException 
    ' Have some code here that logs the content of the exception to a log file, 
    'the Windows Event Log or sends an email - whatever is appropriate 
End Try 

Обратите внимание, что вместо ловли родовое Exception, я поймал IOException. Это происходит потому, что documentation для File.Delete гласит, что вы получите это исключение, когда:

The specified file is in use.

-or-

There is an open handle on the file, and the operating system is Windows XP or earlier. This open handle can result from enumerating directories and files. For more information, see How to: Enumerate Directories and Files.

Вы все еще можете поймать/обрабатывать другие типы исключений, но это никогда не хорошая идея «вслепую» перехватывать и обрабатывать исключения, а не один из его более конкретных вариантов.

Вы также можете попытка open the file писать, и если это не удается, то вы можете сказать, что файл уже открыт в другом месте:

Try 
    System.IO.File.Open("AFileThatsInUse.doc", FileMode.Open, FileAccess.Read, FileShare.None) 
Catch ex as IOException 
    ' As before, what you do when you determine the file is in use is up to you 
End Try 

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

+0

спасибо за информацию, но мне это не нравится. Итак, есть другой способ. Я хочу проверить, пользуется или нет. – zanhtet

+0

@zanhtet, я только что преобразовал код в VB.net, поскольку я помнил, что вы отметили вопрос vb.net. Как я уже сказал в своем ответе, нет уверенного способа убедиться, что файл используется до удаления, поскольку он может меняться между * проверкой * и * удалением *, но я собираюсь добавить пример с помощью ' Метод File.Open'. – Rob

+0

спасибо за ответ. Но я не хочу использовать исключение catch catch. Итак, я хочу проверить использование «if». – zanhtet