【问题标题】:Using FileStream classes to copy files, why does output not match input?使用 FileStream 类复制文件,为什么输出与输入不匹配?
【发布时间】:2010-08-06 19:42:20
【问题描述】:

为什么下面的代码没有生成与输入文件相同的输出文件?

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

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 长度的整个块。

【问题讨论】:

  • 如果目标是复制一个文件,我会使用任何可用的复制机制。我认为就像 File.Copy 如果它是读取一个流并写出另一个流,那么我我对你在这里的大量代码感到困惑..
  • 一个更具描述性的问题标题可能会产生更多的答案。
  • 描述这些数据是如何关闭的会有所帮助。新行是否已更改?零个字符写入文件?等等。具体一点,至于你的问题标题,这非常糟糕。这不是您的个人论坛。
  • 如果你举例说明十六进制比较的不同之处,也许它也会有所帮助......
  • 研究using 语句的前两行,以确保关闭文件并释放相关资源。

标签: c#


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        为什么不检查fsIn.Read() 的返回值?我没有(开发人员)使用 Windows 平台的经验,但您能否始终确定准确读取此字节数?文件结尾怎么办? :)

        【讨论】:

          猜你喜欢
          • 2020-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多