C# 将二进制文件的前X字节读入新文件
我正在尝试获取文件的前几个K,并将其存储到临时文件中,除了长度以外,不做任何更改。出于某种原因,这段代码似乎是从文件的中间而不是开始返回一些内容C# 将二进制文件的前X字节读入新文件,c#,filestream,binaryfiles,C#,Filestream,Binaryfiles,我正在尝试获取文件的前几个K,并将其存储到临时文件中,除了长度以外,不做任何更改。出于某种原因,这段代码似乎是从文件的中间而不是开始返回一些内容 public static FileStream stream = new FileStream(@"isam.dat", FileMode.Open, FileAccess.Read); public static FileStream shortFile = null; int limit = 10000; publ
public static FileStream stream = new FileStream(@"isam.dat", FileMode.Open, FileAccess.Read);
public static FileStream shortFile = null;
int limit = 10000;
public MainWindow()
{
byte[] block = new byte[limit];
while (stream.Read(block, 0, limit) > 0)
{
using (FileStream fs = File.Create("tempfile.dat"))
{
fs.Write(block, 0, block.Length);
if (stream.Position > limit)
{
return;
}
}
if (stream.Position > limit)
{
return;
}
}
InitializeComponent();
}
我做错了什么?文件。每次循环迭代时,Create(filename)都会覆盖该文件。您需要追加,或者保持“tempfile.dat”处于打开状态,直到循环完成。这一行是错误的:
using (FileStream fs = File.Create("tempfile.dat"))
它强制为每次读取的块创建一个新文件。您需要移动到您第一次开始从流读取的位置之上
此外,在第一次读取后,if(stream.Position>limit)
条件仍将是true
,因为位置应恰好位于limit
值
你可能想要更像这样的东西:
public static FileStream stream = new FileStream(@"isam.dat", FileMode.Open, FileAccess.Read);
public static FileStream shortFile = null;
const int limit = 10000;
public MainWindow()
{
byte[] block = new byte[limit];
using (FileStream fs = File.Create("tempfile.dat"))
{
while (stream.Read(block, 0, limit) > 0 && stream.Position <= limit)
{
fs.Write(block, 0, block.Length);
}
}
InitializeComponent();
}
只是想进一步说明一下。。。您的
using(…)
语句将在代码离开块后关闭该文件,这将在每次循环迭代中覆盖该文件,除非您执行建议的操作,并使用(…)作为追加或删除打开
阻塞并在需要时手动打开/关闭文件。while
循环应该使用块进入内部,而不是相反。如果您只想写入第一个限制
字节,那么就不应该使用while循环。谢谢,我在重复使用一些代码,在每个块上循环,但是文件太大了,所以我想缩短它们。我忘了取出while循环。
public static FileStream stream = new FileStream(@"isam.dat", FileMode.Open, FileAccess.Read);
public static FileStream shortFile = null;
const int limit = 10000;
public MainWindow()
{
byte[] block = new byte[limit];
using (FileStream fs = File.Create("tempfile.dat"))
{
int bytes = stream.Read(block, 0, limit);
if (bytes > 0)
{
fs.Write(block, 0, bytes);
}
}
InitializeComponent();
}