Как проверить, используется ли файл? - PullRequest
4 голосов
/ 22 августа 2009

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

try
{
    FileStream stream = new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.Read);
}
catch (IOException ex)
{
    // ex.Message == "The process cannot access the file 'XYZ' because it is being used by another process."
}

Я огляделся по сторонам, и лучшее, что я могу найти, - это провести какой-то опрос, сделав попытку внутри, и это выглядит как , так что хакерский. Я бы ожидал, что что-то будет на System.IO.FileInfo, но это не так.

Есть идеи, как лучше?

Ответы [ 2 ]

4 голосов
/ 22 августа 2009

"Вы можете напрямую вызывать функцию API LockFile через слой P / Invoke. Вы можете использовать дескриптор, возвращаемый свойством SafeFileHandle в FileStream. Прямой вызов API позволит вам проверить возвращаемое значение для условия ошибки, а не прибегать к перехвату исключения. "

" Блок try / catch является ПРАВИЛЬНЫМ решением (хотя вы хотите перехватить IOException, а не все исключения). Невозможно правильно синхронизировать, потому что тестирование lock + получение блокировка не является атомарной операцией. "

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

С помощью C # можно проверить, удерживается ли блокировка для файла

http://www.dotnet247.com/247reference/msgs/32/162678.aspx

0 голосов
/ 22 августа 2009

Ну, функция, которая будет пытаться это сделать, просто попытается перехватить цикл. Как и в случае с базами данных, лучший способ выяснить, ЕСЛИ вы можете что-то сделать, это попробовать. Если не получится, разберись с этим. Если ваш многопоточный код отключен, нет никаких причин, по которым ваша программа не сможет открыть файл, если он не открыт пользователем в другой программе.

Если, конечно, вы делаете интересные вещи.

...