2009-07-07 6 views
5

Я хочу создать и открыть файл, но только если он не существует. Я не хочу использовать File.Exists, потому что поток через переключатель после создания файла с тем же именем.Как обнаружить причину System.IO.IOException существующим файлом?

Как проверить, вызвано ли исключение System.IO.IOException существующим файлом? Я предпочитаю не разбирать ошибку msg (даже если это может быть так просто .indexOf («существует»))

Как мне это сделать?

+0

является файл семафора, почему так много споров? – DevelopingChris

+0

DevelopingChris: Нет, я просто не хочу случайно перезаписывать его, так как шанс моего генератора randomId (используя класс random) может генерировать одинаковые идентификаторы из-за многоядерных процессоров и синхронизации. – 2009-07-07 05:57:23

+0

См. Также http://stackoverflow.com/questions/425956/ как-д-я-определение, если-ан-IOException-это-брошен, потому-на-а-обмен-нарушения. Принятый ответ имеет очень полезную ссылку. – finnw

ответ

5

Вам следует избегать принятия логических решений на основе содержимого свойства Exception.Message. Это определено как человеко-читаемое сообщение, а не что-то для программы для чтения. Такие сообщения могут быть изменены без предварительного уведомления.

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


Как вы могли бы сказать, вопрос о логике программы в зависимости от сообщений человека считываемого является моим любимой мозолью - Я не буду говорить вам о том, как долго, так как это сделало бы меня чувствовать себя старым , Это отвлекло меня от того, что должно было быть очевидно.

Пожалуйста, проверьте, не получен ли файл System.IO.FileNotFoundException, когда файл не существует. Попробуйте поймать это вместо IOException.

+0

вот в чем проблема. я понятия не имею, как проверить. Думаю, я мог бы использовать .exist, но это кажется неряшливым. – 2009-07-07 00:28:45

+0

Ты пропустил мою мысль. Не проверяйте свойство Message, когда-либо. –

+0

Пока я согласен с настроением, я могу думать об исключениях (каламбур не предназначен). –

0

Вы можете использовать File.Open и называть его FileMode.OpenOrCreate.

За комментарий: Хорошо, как насчет FileMode.CreateNew? Затем, если он уже есть, вы получите исключение IOException, иначе сделайте новый.

+1

Это именно то, что acidzombie24 не хочет ... –

+0

О, я вижу, вы имеете в виду, что он не хочет его открывать, если он уже есть? –

+0

Он сказал, что хочет «создать и открыть файл, но только если он не существует». Это именно то, что делает CreateNew. Я дал +1, чтобы компенсировать несправедливость -1. –

3

Вы всегда можете проверить File.Exists() ... из ININ блока catch catch. Вы не хотите проверять до этого из-за потоковой передачи - так что проверьте, знаете ли вы, что у вас есть проблема.

Предполагая, что вы не будете удалять файл из другой темы, это было бы простым и очевидным способом сделать это.

Не забывайте, что File.Exists может сам вызвать исключение, поэтому обязательно поймайте его снова.

+2

Там нет гонки? –

+0

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

+0

также, возможно, потребуется рассмотреть, какой процент времени он ожидает, что файл будет там –

6

Я не уверен, что он хочет открыть файл вообще, если он уже существует.

Я думаю, что он на самом деле после FileMode.CreateNew, это будет вызывать IOException, если файл уже существует, но в противном случае он создаст и откроет его.

+1

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

+0

Документация конструктора 'FileStream' очень сильно подразумевает, что в этом режиме' IOException' будет вызываться только в том случае, если файл уже существует, иначе вы получите одно из более полученных (и более конкретных исключений). Таким образом, вы правы в том, что обработчик исключений должен будет проверить, что фактический тип исключения (или нет) 'IOException'. – jerryjvl

3

Ваш лучший вариант здесь - использовать функцию CreateNew при открытии файла для записи.

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

Даже если вы закроете весь доступ к файлу из своего приложения, вы не можете надежно предотвратить создание или удаление какого-либо другого приложения. Даже при наличии достаточных блокировок на уровне файловой системы пользователи могут делать нечестные вещи, например, извлечь USB-ключ из компьютера.

Лучший способ подойти к этой проблеме - использовать открытые параметры, такие как CreateNew.Это позволит выполнить операцию только в том случае, если файл не существует в момент, когда создается попытка создания. Вы можете поймать исключение в этот момент и попытаться сделать вывод, было ли это из существующего файла или какого-либо другого недопустимого исключения доступа.

Такие методы, как File.Exist дают ложное чувство безопасности вашего кода базы и должны быть тщательно изучены на проверку в.

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