Исключение в C # для конструктора FileStream с CreateNew для существующего файла - PullRequest
4 голосов
/ 10 февраля 2012

Я создаю файл в C # (.NET Web Service) и не хочу перезаписывать существующий файл.

Кажется, можно создать FileStream с установленным FileMode.CreateNew. Фактически, он выдает исключение, если файл существует.

Но как мне распознать это исключение в отличие от других возможных исключений, создаваемых созданием файла? Документация в http://msdn.microsoft.com/en-us/library/47ek66wy.aspx перечисляет этот случай как «IOException», который явно неясен, поскольку другие причины могут вызвать это.

Является ли ответом здесь то, что я ловлю IOException, а затем просто делаю File.Exists?

Ответы [ 4 ]

5 голосов
/ 10 февраля 2012

Вы можете получить код ошибки из исключения следующим образом:

int hr = Marshal.GetHRForException( ex );

Если файл существует, он будет 0x80070050.

0 голосов
/ 10 февраля 2012

Я думаю, что метод File.Exists является наиболее элегантным.Вы можете поиграть с отражением, чтобы попытаться угадать первопричину, но это того не стоит.Возможно, InnerException настроен на что-то более отчетливое.Это null?

И свойство Message должно описывать (на английском или на любом другом языке, который вы используете), что именно произошло.Полагаться на строку, возвращаемую Message, также не очень хорошая идея.

Мне нравится ваша идея, если честно.

0 голосов
/ 10 февраля 2012

Я полагаю, что лучшим способом было бы использовать File.Exists, прежде чем пытаться создать FileStream. Пример:

if (File.Exists(path))
{
   //Handle existing file
}
else
{
   FileStream newFile = new FileStream(path, FileMode.CreateNew);
   //Logic to do with your new file
}

Попытка разобрать IOException, чтобы убедиться, что это именно «правильное» IOException, является хрупким. Я считаю, что единственный способ сделать это - сравнить комментарий или описание IOException.

0 голосов
/ 10 февраля 2012

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

...