【发布时间】:2011-04-13 19:10:04
【问题描述】:
FileStream 的读/写方法只能将integer 值作为长度。但是FileStreamobject 在long 中返回长度。在这种情况下,如果文件大小大于integer 值(大约超过 2GB)怎么办。那么FileStream的read/write方法是如何处理long值的。
【问题讨论】:
标签: c# file methods size filestream
FileStream 的读/写方法只能将integer 值作为长度。但是FileStreamobject 在long 中返回长度。在这种情况下,如果文件大小大于integer 值(大约超过 2GB)怎么办。那么FileStream的read/write方法是如何处理long值的。
【问题讨论】:
标签: c# file methods size filestream
然后你以多个块读取和写入。无论如何,CLR 对任何特定对象的大小都有限制(也有大约 2GB IIRC,即使在 64 位 CLR 上也是如此),所以你不可能有一个足够大的字节数组来解决它。
无论如何,您应该在读取时始终循环,因为您不能保证 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 的块写入磁盘。
“流式传输”接口的巨大价值在于您可以以任何方式拥有它。其实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 您的流。
干杯
【讨论】:
据我所知,您仍然可以使用 seek 到达流中的正确位置。
您可能需要循环播放,如果您想阅读超过 2 场演出,您也需要在此处循环播放
【讨论】: