文件流不能正常工作

本文关键字:工作 常工作 不能 文件 | 更新日期: 2023-09-27 18:09:38

我正在尝试使用ReadByte方法读取/写入文件。代码是工作的,但我注意到,他们是不可用的过程后。我打不开。I图像不显示。我一次又一次做错了什么。

 if (openFileDialog1.ShowDialog() == DialogResult.OK) {
     if (saveFileDialog1.ShowDialog() == DialogResult.OK) {
          FileStream fsRead = 
              new FileStream(openFileDialog1.FileName, FileMode.Open);
          FileStream fswrite = 
              new FileStream(saveFileDialog1.FileName, FileMode.Create);
         if (fsRead.Position != fsRead.Length) {
             byte b = (byte)fsRead.ReadByte();
             fswrite.WriteByte(b);
         }      
     }
}

文件流不能正常工作

你只读了一个字节-我怀疑你的意思是写一个while循环而不是if语句:

while (fsRead.Position != fsRead.Length) {
   byte b = (byte)fsRead.ReadByte();
   fswrite.WriteByte(b);
}

然而,这仍然不是很有效。通常最好一次读写块,使用"I can't read any more"来指示文件的结尾:

byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = fsRead.Read(buffer, 0, buffer.Length)) > 0) {
    fswrite.Write(buffer, 0, bytesRead);
}

然而,您并不真的需要自己做这些,因为您可以使用Stream.CopyTo来为您做:

fsRead.CopyTo(fswrite);

注意,你也应该为你的流使用using语句,在语句结束时自动关闭它们。我也会使用File.OpenWriteFile.OpenRead,而不是调用FileStream构造函数,并且只使用Stream变量:

using (Stream read = File.OpenRead(openFileDialog1.FileName),
             write = File.OpenWrite(saveFileDialog1.FileName))
{
    read.CopyTo(write);
}

或者直接使用File.Copy !

使用后需要关闭文件,在此之前文件将被锁定。

最佳实践是使用using (var fs = new FileStream(...) { ... }结构-在这种情况下,文件流和底层文件将在使用作用域完成后关闭。

应该是这样的

if (openFileDialog1.ShowDialog() == DialogResult.OK) {
    if (saveFileDialog1.ShowDialog() == DialogResult.OK) {
        using (FileStream fsRead = new FileStream(openFileDialog1.FileName, FileMode.Open))
        using (FileStream fswrite = new FileStream(saveFileDialog1.FileName, FileMode.Create)) {
            // your logic here
            if (fsRead.Position != fsRead.Length) {
               byte b = (byte)fsRead.ReadByte();
               fswrite.WriteByte(b);
            }
        }
    }