2012-01-01 45 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

你想做什么? 你有没有尝试用一些文本编辑器打开文件,看看它们包含什么? – 2012-01-01 23:37:58

+0

请包含您遇到的错误或例外文本,并在其出现的位置指明代码行。 – rfmodulator 2012-01-01 23:42:51

+0

用十六进制编辑器打开保存的文件,并查看它们包含的内容。 – 2012-01-01 23:48:54

回答

5

使用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); 
     } 
+0

完美。非常感谢 – robert 2012-01-02 00:49:15

+0

@ user1125508:欢迎您,欢迎来到stackoverflow!请记住,如果答案解决了您的问题,您应该点击答案旁边的复选标记,一旦您拥有足够的声望,答案旁边的数字上方的向上箭头即可。谢谢! – 2012-01-02 00:52:36

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所有字节。