Метод записи .NET File Stream записывает все пустые строки - PullRequest
2 голосов
/ 14 декабря 2009

У меня консольное приложение C # для доступа к файлам по сети и записи в него. Я заметил, что некоторые файлы были повреждены, и в них была записана только нулевая запись. Я не получил никаких исключений. Я использую простой код, который записывает байтовый массив в поток файла. При открытии файлов в двоичном режиме все, что я вижу, это нули, что-то вроде «0: 00 00 00 00». 10:00 00 00 00 ".

Кто-нибудь знает, почему это могло произойти? Возможно, произошел сбой сети, но при сбоях в сети должны были возникнуть некоторые исключения ввода-вывода, верно?

Дайте мне знать, если у кого-нибудь есть идеи по этому поводу.

Пример кода:

FileInfo fi = new FileInfo(filePath);
using (FileStream fs = fi.Open (FileMode.Create, FileAccess.Write, FileShare.None))
{
   fs.Write(byteData, 0, byteData.Length);
}

Ответы [ 4 ]

9 голосов
/ 14 декабря 2009

Обязательно вызовите FileStream.Flush (), где это необходимо.

3 голосов
/ 14 декабря 2009

Убедитесь, что вы закрываете файл.

2 голосов
/ 15 декабря 2009

Поскольку tzerb выше упомянул свой код, я подумал, что было бы лучше добавить еще один слой, попробовать / поймать, чтобы проверить, действительно ли ловится исключение - я удивлен, что исключение не произошло но стоит попробовать

try{
  FileInfo fi = new FileInfo(filePath); 
  using (FileStream fs = fi.Open (FileMode.Create, FileAccess.Write, FileShare.None)) 
  { 
    fs.Write(byteData, 0, byteData.Length); 
    fs.Flush();
    fs.Close();
  }
}catch(System.Security.SecurityException secEx){
  Console.WriteLine("SecurityException caught: {0}", secEx.ToString());
}catch(System.IO.IOException ioEx){
  Console.WriteLine("IOException caught: {0}", ioEx.ToString());
} 

Подтвердите, если вы действительно получили сообщение «IOException catch: ...»

Редактировать: Добавили ли исключение безопасности, чтобы посмотреть, связано ли это с разрешениями?

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 14 декабря 2009

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


FileInfo fi = new FileInfo(filePath); 
using (FileStream fs = fi.Open (FileMode.Create, FileAccess.Write, FileShare.None)) 
{ 
    fs.Write(byteData, 0, byteData.Length); 
    fs.Flush();
    fs.Close();
} 

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

...