在.NET Windows窗体中读取和写入字节数组

时间:2012-01-01 23:34:30

标签: .net file-io

为什么以下代码不起作用(使用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 个答案:

答案 0 :(得分:6)

使用文件字节数组方法可获得更好的结果。

此外,无论何时使用一次性物品,都要使用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);
        }

答案 1 :(得分:2)

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

您实际上从不读取字节,只是将数组初始化为正确的大小,但不填写数据。这意味着你正在为你的新文件写一堆零字节。

而是使用框架为您带来优势 - File类已经有一个静态方法来读取所有字节:

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

或者,如果上面确实是您尝试做的全部范围,请使用File.Copy()

答案 2 :(得分:1)

我的猜测是你正在写一个数组。见这一行:

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

然后这一行:

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

您实际上可以使用第一个文件流作为第二个文件流的数据源Reading所有字节。