Чтение и запись байтовых массивов в .NET Windows Forms - PullRequest
3 голосов
/ 02 января 2012

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

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

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);
}

Ответы [ 3 ]

7 голосов
/ 02 января 2012

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

Также используйте 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);
        }
2 голосов
/ 02 января 2012
FileStream stream = File.OpenRead(filename);  
byte[] array = new byte[stream.Length];

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

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

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

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

1 голос
/ 02 января 2012

Полагаю, вы пишете пустой массив. Смотрите эту строку:

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

А затем эта строка:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...