FileStream读/写方法的局限性

| FileStream的读/写方法只能将“ 0”值作为长度。但是
FileStream
对象返回length2ѭ的长度。在这种情况下,如果文件大小大于
integer
值(大约大于2GB),该怎么办。然后FileStream的读取/写入方法如何处理“ 2”值。     
已邀请:
然后,您将读写多个块。无论如何,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的数据 如果确实要在内存中连续缓冲该数量(?maby作为不安全获取的UnmanagedMemoryStream来实现核心转储?),则可以轻松地在多个调用中分批写入。无论如何,它将在当前硬件上以512k到最大4k的块写入磁盘。 \'streaming \'接口的巨大价值在于您可以通过任何方式获得它。实际上,当您查看它时,会发现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
Closing
Disposing
。 干杯     
据我所知,您仍然可以使用seek到达流中的正确位置。 您可能需要循环执行此操作,并且如果您想阅读2个以上的演出,您也需要在这里循环     

要回复问题请先登录注册