文件流不能正常工作
本文关键字:工作 常工作 不能 文件 | 更新日期: 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.OpenWrite
和File.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);
}
}
}