По сути, я хотел бы проверить, есть ли у меня права на открытие файла, прежде чем я действительно попытаюсь его открыть; Я не хочу использовать для этой проверки команду try / catch, если только в этом нет необходимости. Есть ли свойство доступа к файлам, которое я могу проверить заранее?
c#
.net
file-access
Horas
источник
источник
Ответы:
Я делал это бесчисленное количество раз в прошлом, и почти каждый раз я делал это неправильно, даже делая попытку.
Права доступа к файлам (даже наличие файла) непостоянны - они могут измениться в любое время. Благодаря закону Мерфи это особенно касается короткого периода между проверкой файла и попыткой его открытия. Изменение еще более вероятно, если вы находитесь в районе, где, как вы знаете, вам нужно сначала проверить. Но, как ни странно, этого никогда не произойдет в ваших средах тестирования или разработки, которые обычно довольно статичны. Это затрудняет последующее отслеживание проблемы и упрощает внедрение этой ошибки в производственную среду.
Это означает, что вы все равно должны иметь возможность обрабатывать исключение, если права доступа или существование файла плохие, несмотря на вашу проверку. Код обработки исключений требуется независимо от того, проверили ли вы разрешения для файла заранее. Код обработки исключений предоставляет все функции проверки существования или разрешений. Кроме того, хотя такие обработчики исключений, как известно, работают медленно, важно помнить, что ввод-вывод диска еще медленнее ... намного медленнее ... и вызов функции .Exists () или проверка разрешений приведет к дополнительному отключению из файловой системы.
Таким образом, первоначальная проверка перед попыткой открытия файла избыточна и расточительна. Нет никаких дополнительных преимуществ по сравнению с обработкой исключений, это на самом деле повредит, а не поможет вашей производительности, это приведет к увеличению затрат с точки зрения большего количества кода, который необходимо поддерживать, и это может внести небольшие ошибки в ваш код. В проведении первоначальной проверки просто нет никаких преимуществ. Вместо этого правильнее всего просто попытаться открыть файл и приложить усилия к хорошему обработчику исключений, если он не удастся. То же самое верно, даже если вы просто проверяете, существует ли файл. Это рассуждение применимо к любому изменчивому ресурсу.
источник
Подсказка для тех, кто приходит сюда с похожей проблемой:
Не упустите приложения для веб-синхронизации, такие как DropBox. Я просто потратил 2 часа, думая, что оператор "using" (шаблон Dispose) не работает в .NET.
В конце концов я понял, что Dropbox постоянно читает и записывает файлы в фоновом режиме, чтобы синхронизировать их.
Угадайте, где находится моя папка проектов Visual Studio? Конечно, внутри папки «Мой Dropbox».
Поэтому, когда я запускал свое приложение в режиме отладки, DropBox постоянно обращался к файлам, которые он читал и записывал, для синхронизации с сервером DropBox. Это вызвало конфликты блокировки / доступа.
По крайней мере, теперь я знаю, что мне нужна более надежная функция открытия файла (например, TryOpen (), которая сделает несколько попыток). Я удивлен, что это еще не встроенная часть фреймворка.
[Обновить]
Вот моя вспомогательная функция:
источник
using
должен будет использовать его ...using
здесь работать не будет. В конце блока использованияfs
будет принудительно закрыто. Вы передадите вызывающей стороне ЗАКРЫТЫЙ (бесполезный) поток файлов!Вот решение, которое вы ищете
это создает новое разрешение на чтение на основе представления пути ко всем файлам, а затем проверяет, равно ли оно чтению доступа к файлу.
источник
Первое, что сказал Джоэл Кохорн.
Также: вам следует изучить предположения, которые лежат в основе вашего желания избегать использования try / catch, если вам не нужно. Типичная причина отказа от логики, зависящей от исключений (создание
Exception
объектов плохо работает), вероятно, не имеет отношения к коду, открывающему файл.Я полагаю, что если вы пишете метод, который заполняет
List<FileStream>
, открывая каждый файл в поддереве каталога, и вы ожидали, что большое их количество будет недоступно, вы можете проверить права доступа к файлу, прежде чем пытаться открыть файл, чтобы вы не получить слишком много исключений. Но вы все равно справитесь с исключением. Кроме того, вероятно, что-то ужасно не так с дизайном вашей программы, если вы пишете метод, который делает это.источник
источник
источник
attempts
пропущено по исх? Это не имеет смысла. Также не проводится тестирование<=
вместо просто==
.throw ex
это действительно правильное решение.