2014-12-04 4 views
1

Я предлагаю загружать файлы с моего сайта пользователям. Когда файл существует, он работает нормально. Но если файл будет удален по какой-либо причине, я получаю следующее сообщение об ошибке в Visual Studio:Обработка DirectoryNotFoundException errors

An exception of type 'System.IO.DirectoryNotFoundException' occurred in 
mscorlib.dll but was not handled in user code 

и пользователи просто увидеть JSON строку на веб-сайте.

Я использую это предложение на поток:

var result = new HttpResponseMessage(HttpStatusCode.OK); 
result.Content = new StreamContent(
     new FileStream(mediaFile.FilesystemLocation, FileMode.Open)); 

mediaFile.FilesystemLocation просто так:

public virtual string FilesystemLocation 
{ 
    get { return Path.Combine(FilesystemRoot, Id + "." + Extension); } 
} 

Я попытался положить все это в TRY/поймать блок, но затем он потерял все эти ссылки другим классам.

Итак, мой вопрос: как я могу обработать этот код и предотвратить эту ошибку?

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

Спасибо!

+0

«Помещение всего объекта в блок try/catch» не должно приводить к потере каких-либо ссылок. –

ответ

2

System.IO.File.Exists будет вашим другом здесь. Прежде чем вы установите result.Content, позвоните в первую очередь. Если файл не существует, метод возвращает false, и вы можете соответствующим образом настроить свою логику.

var filepath = mediaFile.FilesystemLocation; 

if (!File.Exists(filepath)) 
{ 
    return new HttpResponseMessage(404); 
} 
else{ 
    var result = new HttpResponseMessage(HttpStatusCode.OK); 

    //just in case file has disappeared/or is locked for open, 
    //wrap in try/catch 
    try 
    { 
     result.Content = new StreamContent(
      new FileStream(filepath, FileMode.Open)); 
    } 
    catch 
    { 
     return new HttpResponseMessage(500);   
    } 

    return result; 
} 
+1

wow, это красивый. Спасибо, я попробую. – SkyeBoniwell

+3

, но вам все равно нужно попробовать/уловить результат. Контент = ..., так как вы все равно можете удалить файл между проверкой его существования и его открытием. – weloytty

+1

Хорошая точка. Я обновлю код. –

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