【发布时间】: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#