FileStream读/写方法的限制

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

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

无论如何你总是应该在读取时循环,因为你无法保证读取调用将读取你请求的字节数,即使有更多数据要来。

编辑:阅读块:

 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到max4k的块写入磁盘。

“流媒体”界面的巨大价值在于你可以以任何方式拥有它。 事实上, 当你调查它时你会发现CLRarrays(和其他任何东西)实际上是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); } } 

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

干杯

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

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