无法使用从另一个文件(chunk-by-chunk)检索的字节数组重新构造文件

时间:2015-12-14 02:19:43

标签: c# .net compact-framework

我目前正在尝试通过从文件A(chunk-by-chunk)中提取一定长度的字节来构造文件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;
                }
            }
 }

我认为问题在于我的逻辑,但我无法弄清楚原因。任何帮助表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:1)

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);
        }
    }
}

请注意,您不需要明确关闭bwreader,因为using声明会为您执行此操作。另请注意,在第一次Seek()来电后,BinaryReader中的排名将会跟踪。