см. Этот вопрос:
как можно легко проверить, запрещен ли доступ к файлу в .NET?
Короткая версия этого вопроса такова, что вы этого не сделаете, потому что файловая система нестабильна. Просто попробуйте открыть файл и перехватить исключение в случае сбоя.
Причина, по которой ваш метод isFileFound
не работает, заключается в том, что используемая вами структура FileInfo
также может использоваться для создания файлов. Вы можете создать объект FileInfo с необходимой информацией для несуществующего файла, вызвать его метод .Create()
, и вы сразу установили нужные свойства.
Я подозреваю, что причиной сбоя пути UNC является либо 1) проблема с правами доступа к общему ресурсу администратора от пользователя, запустившего ваше приложение, или 2) Символ $
вызывает метод либо потому что он вводится неправильно или из-за ошибки в базовой реализации .Exists ().
Обновление:
Когда я публикую это предложение, я почти всегда получаю жалобу на выполнение исключений. Давай поговорим об этом. Да, обработка исключений стоит дорого: очень дорого. Есть несколько вещей, которые вы можете сделать в программировании, которые медленнее. Но вы знаете, что это за эти несколько вещей? Дисковый и сетевой ввод / вывод. Вот ссылка, показывающая, сколько стоит дисковый ввод-вывод и сетевой ввод-вывод:
https://gist.github.com/jboner/2841832
Latency Comparison Numbers
--------------------------
L1 cache reference 0.5 ns
Branch mispredict 5 ns
L2 cache reference 7 ns 14x L1 cache
Mutex lock/unlock 25 ns
Main memory reference 100 ns 20x L2 cache, 200x L1 cache
Compress 1K bytes with Zippy 3,000 ns
Send 1K bytes over 1 Gbps network 10,000 ns 0.01 ms
Read 4K randomly from SSD* 150,000 ns 0.15 ms
Read 1 MB sequentially from memory 250,000 ns 0.25 ms
Round trip within same datacenter 500,000 ns 0.5 ms
Read 1 MB sequentially from SSD* 1,000,000 ns 1 ms 4X memory
Disk seek 10,000,000 ns 10 ms 20x datacenter roundtrip
Read 1 MB sequentially from disk 20,000,000 ns 20 ms 80x memory, 20X SSD
Send packet CA->Netherlands->CA 150,000,000 ns 150 ms
Если думать в наносекундах не ваше дело, вот еще одна ссылка, которая нормализует один цикл ЦП как 1 секунду и масштабируется оттуда:
http://blog.codinghorror.com/the-infinite-space-between-words/
1 CPU cycle 0.3 ns 1 s
Level 1 cache access 0.9 ns 3 s
Level 2 cache access 2.8 ns 9 s
Level 3 cache access 12.9 ns 43 s
Main memory access 120 ns 6 min
Solid-state disk I/O 50-150 μs 2-6 days
Rotational disk I/O 1-10 ms 1-12 months
Internet: SF to NYC 40 ms 4 years
Internet: SF to UK 81 ms 8 years
Internet: SF to AUS 183 ms 19 years
OS virt. reboot 4 s 423 years
SCSI command time-out 30 s 3000 years
Hardware virt. reboot 40 s 4000 years
Physical system reboot 5 m 32 millenia
Принимая даже самый лучший сценарий для исключений, вы можете получить доступ к памяти как минимум 480 раз, ожидая первого ответа от диска, и это предполагает очень быстрый SSD. Многим из нас все еще нужны вращающиеся жесткие диски, где дела идут намного хуже.
И это только начало истории. Когда вы используете .Exists()
, вы берете на себя эту дополнительную стоимость (и это дополнение: вам придется делать ту же самую работу снова, когда вы открываете файл) при каждой попытке , Вы оплачиваете эту стоимость независимо от того, существует файл или нет, потому что диск все равно должен искать его в своих файловых таблицах. При использовании метода исключения вы оплачиваете только дополнительную стоимость разматывания стека вызовов в случае сбоя.
Другими словами, да: исключения ужасно дороги. Но по сравнению с проверкой диска она все же быстрее: и не с небольшим отрывом. К счастью, это вряд ли повлияет на общую производительность вашего приложения ... но я все же хочу уложить аргумент "исключения являются медленными" для этой конкретной задачи.