2012-01-01 2 views
3

Почему не работает следующий код (проверено с использованием документов Word и файлов PDF)?Чтение и запись байтовых массивов в .NET Windows Forms

Сохраненный файл запускает правильное приложение, но оно повреждено и не открывается.

OpenFileDialog openFileDialog1 = new OpenFileDialog(); 
if (openFileDialog1.ShowDialog() != DialogResult.OK) 
    return; 

string filename = openFileDialog1.FileName; 
FileStream stream = File.OpenRead(filename); 
byte[] array = new byte[stream.Length]; 

SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 
saveFileDialog1.FileName = filename; 
if (DialogResult.OK != saveFileDialog1.ShowDialog()) 
    return; 

FileInfo fi = new FileInfo(saveFileDialog1.FileName); 
using (FileStream fs = fi.OpenWrite()) 
{ 
    fs.Write(array, 0, array.Length); 
} 
+0

Что вы пытаетесь сделать? Вы пытались открыть файлы с помощью текстового редактора и посмотреть, что они содержат? –

+0

Пожалуйста, включите текст ошибки или исключения, который вы испытываете, и укажите строку кода, в которой он встречается. – rfmodulator

+0

Откройте сохраненные файлы с помощью шестнадцатеричного редактора и посмотрите, что они содержат. –

ответ

5

Используйте методы массива массива файлов для получения лучших результатов.

Также используйте using всякий раз, когда вы работаете с одноразовыми объектами.

 byte[] array; 
     string filename; 

     using (OpenFileDialog openFileDialog1 = new OpenFileDialog()) 
     { 
      if (openFileDialog1.ShowDialog() != DialogResult.OK) 
       return; 
      filename = openFileDialog1.FileName; 
      array = File.ReadAllBytes(filename); 
     } 

     using (SaveFileDialog saveFileDialog1 = new SaveFileDialog()) 
     { 
      saveFileDialog1.FileName = filename; 
      if (DialogResult.OK != saveFileDialog1.ShowDialog()) 
       return; 
      File.WriteAllBytes(array); 
     } 
+0

Отлично. Большое спасибо – robert

+0

@ user1125508: Добро пожаловать, и добро пожаловать в stackoverflow! Имейте в виду, что если ответ решает ваш вопрос, вы должны нажать галочку рядом с ответом и, как только у вас будет достаточно репутации, стрелка вверх над номером рядом с ответом. Благодаря! –

2
FileStream stream = File.OpenRead(filename); 
byte[] array = new byte[stream.Length]; 

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

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

byte[] array = File.ReadAllBytes(filename); 

Или, если выше действительно полный объем того, что вы пытаетесь сделать, просто использовать File.Copy().

1

Мое предположение было бы, что вы пишете пустой массив. Смотрите эту строку:

byte[] array = new byte[stream.Length]; 

А потом эту строку:

fs.Write(array, 0, array.Length); 

Вы можете использовать свой первый FILESTREAM в качестве источника данных для второго по Reading все байты.

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