2013-04-17 4 views
0

В этом случае потоковый поток не генерирует исключение, если файл не существует. Я ожидал, что это вызовет исключение, почему это не так и как я могу заставить его это сделать?Исключение исключения Streamwriter

var fileName = HttpContext.ApplicationInstance.Server.MapPath("~/App_Data/emails.txt"); 
FileStream fs = new FileStream(fileName, FileMode.Append); 
StreamWriter sw = new StreamWriter(fs); 
sw.WriteLine(String.Format("{0}\t{1}", email, name)); 
sw.Flush(); 
sw.Close(); 
fs.Close(); 

Почему?

+4

Рассмотрите возможность редактирования этого сообщения, чтобы включить вопрос. Например, «я ожидал, что это вызовет исключение, почему это не так и как я могу заставить его сделать это?». –

ответ

3
FileStream fs = new FileStream(fileName, FileMode.Append); 

Это создаст файл, если он не существует (и добавляет к нему, если это так).

Предполагая, что ваш пост (в этом нет никаких вопросов!), Вы не хотите, чтобы он создавал первый вызов файла File.Exists, чтобы гарантировать, что файл существует.

+0

Или, лучше, вызовите 'File.AppendText', чтобы получить' StreamWriter' напрямую. – leppie

1

Попробуйте это:

try 
{ 
    var fileName = HttpContext.ApplicationInstance.Server.MapPath("~/App_Data/emails.txt"); 
    if (System.IO.File.Exists(fileName)) 
    { 
     FileStream fs = new FileStream(fileName, FileMode.Append); 
     StreamWriter sw = new StreamWriter(fs); 
     sw.WriteLine(String.Format("{0}\t{1}", email, name)); 
     sw.Flush(); 
     sw.Close(); 
     fs.Close(); 
    } 
    else 
    { 
     //Throw error here 
    } 
} 
catch() 
{ 

} 
2

Если вы хотите, чтобы убедиться, что вы добавления в существующий файл, используйте FileMode.Open, а затем Seek до конца, прежде чем писать. С File.Exists есть (очень тонкий) шанс другого процесса, удаляющего файл после проверки, но до построения FileStream.

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