FileStream读/写方法的限制

时间:2011-04-13 19:10:04

标签: c# file methods size filestream

FileStream的读/写方法只能取integer个值作为长度。但是FileStream对象返回long中的长度。在这种情况下,如果文件大小大于integer值(大约超过2GB),该怎么办?然后FileStream的读/写方法如何处理long值。

3 个答案:

答案 0 :(得分:13)

然后你用多个块读写。无论如何,CLR对任何特定对象的大小都有限制(即使在64位CLR上也大约2GB IIRC),所以你不能让字节数组大到足以使它成为一个问题。

你总是应该在阅读时循环,因为你不能保证Read调用会读取你请求的字节数,即使有更多数据要来。

编辑:大块阅读:

byte[] buffer = new byte[1024 * 32];
int bytesRead;

while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
    // Use the data you've read
}

以大块写作将取决于你所写的内容......很难抽象地谈论它。

答案 1 :(得分:4)

无需在一次通话中直接写入超过2Gb的数据

如果你真的有这个数量在内存中连续缓冲(?maby作为一个不安全获取的UnmanagedMemoryStream来实现核心转储?)你可以轻松批量多次调用中的写入。无论如何,它将在当前硬件上以512k到max4k的块写入磁盘。

“流媒体”界面的巨大价值在于您无论如何都可以拥有它。事实上,when you look into to it you will find that the CLR Arrays (and anything else) are actually bounded to 2GB

更新

由于您现在已经承认您基本上想要复制流,因此您可以通过即时解决方案获得更好的服务。有File.Copy

File.Copy("file-a.txt", "file-new.txt");

或者有the standard answer

Stream input
input.CopyTo(output); // .NET 4.0

// .NET 3.5 and others
public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[32768];
    while (true)
    {
        int read = input.Read (buffer, 0, buffer.Length);
        if (read <= 0)
            return;
        output.Write (buffer, 0, read);
    }
}

如果您手动处理流,请不要忘记适当的FlushingClosingDisposing您的Streams

干杯

答案 2 :(得分:0)

据我所知,你仍然可以使用seek来找到流中的正确位置。

你可能需要循环才能这样做,如果你想阅读超过2场演出,你也需要在这里循环