2011-12-14 2 views
0

Можно создать дубликат:
How to test if a file is fully copied in .NETКак проверить, если файл полностью скопирован перед его открытием КРОМЕ использованием попробовать поймать

Как почти 2012, там до сих пор нет лучшего способа, чтобы проверить, полностью ли скопирован файл, чтобы открыть его в блоке try ~ catch?

Я знаю, что это было задано раньше, и я проверил автоматические связанные вопросы Stack Overflow, но им больше двух лет, так что, возможно, сегодня существует лучшее решение?

Это аналогичный вопрос 2009: How to test if a file is fully copied in .NET

EDIT: Я изменил название на вопрос, так как она подняла «requestioning» вопросы.

+0

@AlejoBrz, повторяя вопрос, который уже был задан, чтобы привлечь к нему новое внимание, не так работает. Это то, за что щедроты (хотя и признательно, что у вас нет репутации). –

+0

точно, как я сказал по моему вопросу, и даже добавил ссылку на него: «Но я сказал, что это было опубликовано два года назад ... –

+0

@ Кирк, я не пытался привлечь к нему внимание, но чтобы посмотреть, лучшее решение появилось, поскольку ловить ошибку кажется действительно грязным способом сделать это. –

ответ

2

Нет, до сих пор нет способа сделать это, не используя try ... catch, и если бы я был вами, я бы не задерживал дыхание, ожидая его.

Что вы действительно просите - это группа функций, которые могут сказать вам, удастся ли попытка открыть файл в определенном режиме. Что-то вроде File.CanOpenForExclusiveRead() или что-то подобное. В .NET таких методов нет, и они не существуют в Windows API. И не зря.

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

if (File.CanOpenForExclusiveRead(filename)) 
{ 
    f = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.None); 
} 

Звучит неплохо, правда? За исключением того, что еще нужно поместить вокруг конструктора FileStream, потому что какой-то другой поток (возможно, в другом процессе) может открыть файл для эксклюзивного чтения между моментом проверки кода и временем, когда ваш код называется конструктором. Или что-то еще может пойти не так: файл может быть удален, диск может быть отключен и т. Д.

Уверен, что вымышленный метод File.CanOpenForExclusiveRead был бы полезен в некоторых случаях. Эти случаи, однако, немногочисленны и далеко друг от друга, и, как я показал выше, они все равно не будут делать вам много хорошего, так как вам все равно придется обрабатывать возможные исключения.

Если вам нужен метод, который делает это, напишите свой собственный, который использует try ... catch, и возвращает false, если выбрано исключение. По крайней мере, вы скрываете детали реализации. Но не ждите лучшего решения. Очень маловероятно, что он готов.

+0

Спасибо за ответ, я сделаю это и никогда больше не спрошу! даже в 2020 году! –

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