FileStream的读/写方法只能接受整数
值作为长度。但是FileStream
对象返回的长度是长整型
。在这种情况下,如果文件大小超过整数
值(大约超过2GB),那么FileStream的读/写方法会如何处理长整型
值。
FileStream的读/写方法只能接受整数
值作为长度。但是FileStream
对象返回的长度是长整型
。在这种情况下,如果文件大小超过整数
值(大约超过2GB),那么FileStream的读/写方法会如何处理长整型
值。
那么您可以分块读取和写入。无论如何,CLR 对任何特定对象的大小都有限制(即使在 64 位 CLR 上也是如此,约为 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的数据是没有必要的。
如果您确实需要在内存中连续缓冲该数量的数据(可能是使用不安全获取的UnmanagedMemoryStream来实现核心转储?),那么您可以轻松地将写操作分批进行多次调用。无论如何,它都会以512k至当前硬件上的最大4k的块大小写入磁盘。
'流'接口的巨大价值在于您可以任意选择。事实上,当您深入研究时,会发现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);
}
}
刷新
、关闭
和释放
,如果你正在手动处理流的话。祝好!