无法使用从另一个文件(逐块)检索的字节数组重建文件
Unable to re-construct a file using byte array retrieved from another file (chunk-by-chunk)
我目前正在尝试通过从文件 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()
returns实际读取的字节数。所以你可以简化你的逻辑并可能解决一些问题,比如:
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
中的位置。
我目前正在尝试通过从文件 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()
returns实际读取的字节数。所以你可以简化你的逻辑并可能解决一些问题,比如:
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
中的位置。