Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用FileStream类复制文件,为什么输出与输入不匹配?_C# - Fatal编程技术网

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

C# 使用FileStream类复制文件,为什么输出与输入不匹配?,c#,C#,为什么下面的代码不能生成与输入文件相同的输出文件 其思想是缓冲文件的一部分,并将其从较小的缓冲区中写入(这是一个小程序,在一个较大的项目中复制错误,我正在对文件进行流式处理)。在十六进制编辑器比较工具中检查这些文件时,输出文件会有所不同 fsIn = new FileStream("c:\\wmvs\\Wildlife.wmv", FileMode.Open, FileAccess.Read); fsOut = new FileStream("c:\\Users\\public\

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

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

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。

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

我不知道您在做什么,但为什么不尝试一下,通过文件流进行读写可能不是编码不可知的,因此请坚持使用流,只需传递字节即可:

using (Stream inStream = File.Open(inFilePath, FileMode.Open))
{
    using (Stream outStream = File.Create(outFilePath))
    {
        while (inStream.Position < inStream.Length)
        {
            outStream.WriteByte((byte)inStream.ReadByte());
        }
    }
}
使用(Stream inStream=File.Open(inFilePath,FileMode.Open))
{
使用(Stream outStream=File.Create(outFilePath))
{
while(流内位置<流内长度)
{
outStream.WriteByte((字节)inStream.ReadByte());
}
}
}

您需要使用
BinaryReader
BinaryWriter
来避免
环境。换行符
将为您提供翻译。

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

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

如果目标是复制文件,我将使用任何可用的复制机制。。我认为这就像一个文件。复制如果它是在一个流中读取,然后写出另一个流,那么我对这里有这么多的代码感到困惑。一个更具描述性的问题标题可能会产生更多的答案。描述数据是如何关闭的会有所帮助。新线换了吗?零个字符写入文件?等等。具体点,至于你的问题标题,它是非常糟糕的。这不是您的个人论坛。如果您举例说明十六进制比较的不同之处,或许也会有所帮助……请在前两行中使用
语句研究
,以确保关闭文件并释放相关资源。如果您希望看到单个字节从a爬行到b,此解决方案非常有用。换句话说:它慢得像地狱一样。更好地使用或者——或者甚至可能只是@dtb:为了使海报的示例尽可能简单,他可以在开始使用I figure.And File.Copy之后,使用一个设置大小的缓冲区。@dtb,注意
.CopyTo()的过载
允许用户指定缓冲区大小。