使用FileStream类复制文件,为什么输出不匹配输入?

时间:2010-08-06 19:42:20

标签: c#

为什么下面的代码不能为输入文件生成相同的输出文件?

这个想法是缓冲文件的一部分并从较小的缓冲区写出来(这是一个小程序,在我正在传输文件的大项目中重现错误)。在十六进制编辑器比较工具中检查这些文件时,输出文件有所不同。

fsIn = new FileStream("c:\\wmvs\\Wildlife.wmv", FileMode.Open, FileAccess.Read);
        fsOut = new FileStream("c:\\Users\\public\\documents\\compare\\out.wmv",      FileMode.Create, FileAccess.Write);

        bData = new byte[fsIn.Length / 10];
        bOut = new byte[524288];

        fsIn.Read(bData, 0, bData.Length);

        bool bGo = true;

        while (bGo)
        {
            if (nWrittenOut == bData.Length)
            {
                fsIn.Read(bData, 0, bData.Length);
            }

            if (nWrittenOut + bOut.Length >= bData.Length)
            {
                Array.Clear(bOut, 0, bOut.Length);

                int nWhatsLeft = bData.Length - nWrittenOut;
                Array.Copy(bData, nWrittenOut, bOut, 0, nWhatsLeft);

                fsIn.Read(bData, 0, bData.Length);
                nWrittenOut = 0;
                int nBufPos = nWhatsLeft;

                nWhatsLeft = bOut.Length - nWhatsLeft;
                Array.Copy(bData, nWrittenOut, bOut, nBufPos, nWhatsLeft);
                nWrittenOut += bOut.Length;

            }
            else
            {
                Array.Copy(bData, nWrittenOut, bOut, 0, bOut.Length);
                nWrittenOut += bOut.Length;
            }

            fsOut.Write(bOut, 0, bOut.Length);
            fsOut.Flush();

            if (fsOut.Position >= fsIn.Length)
                bGo = false;
        }

    }

我已经尝试了以下所有答案,但没有任何效果。它必须是我在代码中的逻辑。但是我看不出问题????似乎我在输出文件中缺少一个与bOut长度相等的整个块。

5 个答案:

答案 0 :(得分:2)

我不知道你在做什么,但为什么不试试这个,通过FileStream读取和写入可能不是编码不可知的,所以坚持使用流并只传递字节: / p>

using (Stream inStream = File.Open(inFilePath, FileMode.Open))
{
    using (Stream outStream = File.Create(outFilePath))
    {
        while (inStream.Position < inStream.Length)
        {
            outStream.WriteByte((byte)inStream.ReadByte());
        }
    }
}

答案 1 :(得分:1)

它可能在文本模式下读/写,因此二进制文件中遇到的任何0x0A都被转换为CR / LF。

答案 2 :(得分:1)

您需要使用BinaryReaderBinaryWriter来避免您提供的Environment.NewLine翻译。

答案 3 :(得分:0)

您需要检查fsIn.Read方法的返回值。 Read方法不会始终读取您请求的字节数。如果你在结果中看到额外的“0”字节,那么这可能是原因。

答案 4 :(得分:0)

为什么不检查fsIn.Read()的返回值?我没有(开发人员)使用Windows平台的经验,但是你能总是确保读取这个字节数吗?文件结束怎么样? :)