FileStream的读/写方法只能取integer
个值作为长度。但是FileStream
对象返回long
中的长度。在这种情况下,如果文件大小大于integer
值(大约超过2GB),该怎么办?然后FileStream的读/写方法如何处理long
值。
答案 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");
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
您的Streams 。
干杯
答案 2 :(得分:0)
据我所知,你仍然可以使用seek来找到流中的正确位置。
你可能需要循环才能这样做,如果你想阅读超过2场演出,你也需要在这里循环