无法使用从另一个文件检索的字节数组(逐块)重新构造文件
本文关键字:文件 数组 字节数 逐块 新构造 字节 检索 另一个 | 更新日期: 2023-09-27 18:26:36
我目前正试图通过从文件a中提取一定长度的字节(逐块)来构建文件B。文件B的大小是38052441字节,它在文件A中的位置是从字节34开始。如果我在一次拍摄中完成,我可以从文件A中提取文件B,而不会出现任何问题,如下面的片段所示。
test = new byte[38052441];
//madefilePath: file A, madecabfilePath: file B
using (BinaryReader reader = new BinaryReader(new FileStream(madefilePath, FileMode.Open)))
using (BinaryWriter bw = new BinaryWriter(File.Open(madecabfilePath, FileMode.OpenOrCreate)))
{
reader.BaseStream.Seek(34, SeekOrigin.Begin);
reader.Read(test, 0, 38052441);
bw.Write(test);
bw.Close();
reader.Close();
}
然而,如果我尝试在多个查询中执行它(我必须这样做,因为这个功能将来会移植到紧凑的框架中),我会不断得到一个损坏的文件。目前,我正在测试第一个20Mb,写入一个文件,然后获取剩余的字节,再次写入文件。
int max = 38052474;
int offset = 34;
int weight = 20000000;
bool isComplete = false;
test = null;
test = new byte[weight];
using (BinaryWriter bw = new BinaryWriter(File.Open(madecabfilePath, FileMode.OpenOrCreate)))
using (BinaryReader reader = new BinaryReader(new FileStream(madefilePath, FileMode.Open)))
{
while (!isComplete)
{
if (offset + weight < max)
{
reader.BaseStream.Seek(offset, SeekOrigin.Begin);
reader.Read(test, 0, weight);
bw.Write(test);
offset = offset + weight;
}
else
{
weight = max - offset;
test = null;
test = new byte[weight];
reader.BaseStream.Seek(offset, SeekOrigin.Begin);
reader.Read(test, 0, weight);
bw.Write(test);
//Terminate everything
reader.Close();
bw.Close();
isComplete = true;
}
}
}
我认为问题出在我的逻辑上,但我不明白为什么。感谢您的帮助。非常感谢。
BinaryReader.Read()
返回实际读取的字节数。因此,你可以简化你的逻辑,并可能通过以下方式解决一些问题:
using (BinaryWriter bw = new BinaryWriter(File.Open(madecabfilePath, FileMode.OpenOrCreate)))
using (BinaryReader reader = new BinaryReader(new FileStream(madefilePath, FileMode.Open)))
{
reader.BaseStream.Seek(offset, SeekOrigin.Begin);
while (!isComplete)
{
int charsRead = reader.Read(test, 0, weight);
if (charsRead == 0)
{
isComplete = true;
}
else
{
bw.Write(test, 0, charsRead);
}
}
}
请注意,您不需要显式关闭bw
或reader
,因为using
语句将为您执行此操作。还要注意,在第一次Seek()
调用之后,将跟踪BinaryReader
中的位置。