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); } }
如果您手动处理流,请不要忘记适当地Flushing
, Closing
和Disposing
流 。
干杯
据我所知,你仍然可以使用seek来找到流中的正确位置。
你可能需要循环才能这样做,如果你想读超过2演出,你也需要在这里循环