文件流读/写方法的限制

本文关键字:方法 文件 | 更新日期: 2023-09-27 17:50:19

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

文件流读/写方法的限制

然后在多个块中读写。无论如何,CLR对任何特定对象的大小都有限制(即使在64位CLR上,IIRC也在2GB左右),所以你不能有一个足够大的字节数组来解决这个问题。

无论如何,你应该在读取时总是循环,因为你不能保证一个Read调用会读取你所请求的那么多字节,即使有更多的数据要来。

编辑:分段阅读:

byte[] buffer = new byte[1024 * 32];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
    // Use the data you've read
}

写块取决于你写的是什么…

不需要在一次调用中直接写入超过2Gb的数据

如果你真的想在内存中连续缓冲那么多(?可能作为不安全获取的UnmanagedMemoryStream来实现核心转储?),您可以轻松地在多个调用中批处理写操作。无论如何,在当前的硬件上,它将以512k到最大4k的块写入磁盘。

"流"接口的巨大价值在于你可以以任何方式拥有它。事实上,当您仔细研究它时,您会发现CLR数组(以及其他任何东西)实际上被限制为2GB

更新

既然您现在已经承认您基本上想要复制流,那么您可能更适合使用即时解决方案。有File.Copy

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

或者有标准答案

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);
    }
}

如果您手动处理流,请不要忘记Flushing, ClosingDisposing

欢呼

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

你可能需要循环这样做,如果你想读超过2个gigs,你也需要在这里循环