FileStream.Read没有读取最后一个'块'

时间:2015-03-03 00:00:57

标签: .net-3.5 filestream

我有一个有趣的场景,我希望其他人偶然发现。我试图复制一部分打开的FileStream来分离c#.Net 3.5中的文件流。使用下面的代码,我阅读了37' chunk' 4096字节,但无法读取最后一个'部分块' 3812字节

string filPath = "c:\aRatherSmallFileThatCouldBeQuiteLarge.log";
string tmpNam = Path.GetTempFileName();
using (FileStream wt = new FileStream(tmpNam, FileMode.Open, FileAccess.Write))
{
    using (FileStream rd = new FileStream(filPath, FileMode.Open, FileAccess.Read))
    {
        long cutPosition = 65217;
        int bytesRead;
        int chunkSize = 4096;
        byte[] buffer = new byte[chunkSize];
        while ((bytesRead = rd.Read(buffer, 0, chunkSize)) != 0)
            wt.Write(buffer, 0, bytesRead);
    }
    File.Copy(tmpNam, filPath, true);
}
File.Delete(tmpNam);

没有产生错误;最终的3812个字节根本没有按预期写入目标文件。

这是一个小例子,但我打算在非常大的文件上使用它......所以将源文件读入内存的解决方案在这里是不可行的。

1 个答案:

答案 0 :(得分:1)

我认为您需要移动File.Copy块之外的using

using (FileStream wt = new FileStream(tmpNam, FileMode.Open, FileAccess.Write))
{
    using (FileStream rd = new FileStream(filPath, FileMode.Open, FileAccess.Read))
    {
        ...
    } // closes the read stream
    // you're trying to move the file here, before the write stream is flushed out
} // closes the write stream (flushing out the last chunk)
// Do the copy after the write stream has been flushed and closed
File.Copy(tmpNam, filPath, true);
File.Delete(tmpNam);

在将最终写入刷新到临时文件之前,您可能正在复制文件。