2009-02-13 4 views
1

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

Private Function FileAvailable(ByVal fileName As String) As Boolean 
    Try 
     Using inputStream As FileStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None) 
      Return True 
     End Using 
    Catch ex As IOException 
     Return False 
    End Try 
End Function 

или

private bool FileAvailable(string fileName) { 
try { 
    using (FileStream inputStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)) { 
     return true; 
    } 
} 
catch (IOException ex) { 
    return false; 
} 

}

Немного эксперт посоветуете по самым лучшим образом. Thanks

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

+0

Вам нужно будет определить, что вы подразумеваете под «Мне нужно что-то сделать с файлом». Различные операции означают разные права доступа, общие права, .... –

+0

Дубликат http://stackoverflow.com/questions/1304/checking-for-file-lock-in-c –

+0

Файл копируется в каталог часов , У другого пользователя нет доступа к каталогу. Мне просто нужно проверить, что файл полностью скопирован в каталог, прежде чем обрабатывать и перемещать файл самостоятельно. Мне нужен эксклюзивный доступ к нему. – jaredmroberts

ответ

8

Как часто вы собираетесь это делать? Если вы выразите это в контексте, предположите, что вы проверяете один раз каждые 50 миллисекунд - это довольно часто. Мой ноутбук (последний раз, когда я проверил) смог выбросить более 100 исключений за миллисекунду ... так что стоимость выброса исключения будет меньше 0,02% от общего времени - и это считается, что он всегда занят!

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

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

+0

Интересно, стоит ли открывать только один способ блокировки файла. – Rauhotz

+2

Состояние гонки Джон упоминает, что вы должны это делать в любом случае, так что просто делайте это напрямую с TryOpenFile, если потребитель не хочет знать, с какими исключениями справиться (это криминальная ошибка модели IOException, там должно быть исключение FileLockedException) – ShuggyCoUk

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