C#文件流读取
我正在使用filestream读取:https://msdn.microsoft.com/en-us/library/system.io.filestream.read%28v=vs.110%29.aspx
我试图做的是一次读取一个循环中的大文件一定数量的字节; 不是一次完整的文件。 代码示例显示了这个阅读:
int n = fsSource.Read(bytes, numBytesRead, numBytesToRead);
“字节”的定义为:“当此方法返回时,包含指定的字节数组,其偏移量和(偏移量+ count - 1)之间的值由当前源读取的字节替换。”
我想一次只读1MB,所以我这样做:
using (FileStream fsInputFile = new FileStream(strInputFileName, FileMode.Open, FileAccess.Read)) {
int intBytesToRead = 1024;
int intTotalBytesRead = 0;
int intInputFileByteLength = 0;
byte[] btInputBlock = new byte[intBytesToRead];
byte[] btOutputBlock = new byte[intBytesToRead];
intInputFileByteLength = (int)fsInputFile.Length;
while (intInputFileByteLength - 1 >= intTotalBytesRead)
{
if (intInputFileByteLength - intTotalBytesRead < intBytesToRead)
{
intBytesToRead = intInputFileByteLength - intTotalBytesRead;
}
// *** Problem is here ***
int n = fsInputFile.Read(btInputBlock, intTotalBytesRead, intBytesToRead);
intTotalBytesRead += n;
fsOutputFile.Write(btInputBlock, intTotalBytesRead - n, n);
}
fsOutputFile.Close(); }
在说明问题区域的地方,btInputBlock在第一个周期工作,因为它读取1024个字节。 但是在第二个循环中,它不会回收这个字节数组。 它会尝试将新的1024个字节附加到btInputBlock中。 据我所知,您只能指定要读取的文件的偏移量和长度,而不能指定btInputBlock的偏移量和长度。 有没有办法“重新使用”Filestream.Read转储的数组,或者我应该找到另一种解决方案?
谢谢。
PS读取的异常是:“偏移量和长度超出了数组的范围,或者计数大于索引到源集合末尾的元素数量。”
这是因为你正在递增intTotalBytesRead,这是数组的偏移量,而不是文件流。 在你的情况下,它应该总是为零,它将覆盖数组中的前一个字节数据,而不是在最后使用intTotalBytesRead附加它。
int n = fsInputFile.Read(btInputBlock, intTotalBytesRead, intBytesToRead); //currently
int n = fsInputFile.Read(btInputBlock, 0, intBytesToRead); //should be
Filestream不需要偏移量,每个Read都会从最后一个离开的地方拾取。 详情请参阅https://msdn.microsoft.com/en-us/library/system.io.filestream.read(v=vs.110).aspx
你的代码可以简化一些
int num;
byte[] buffer = new byte[1024];
while ((num = fsInputFile.Read(buffer, 0, buffer.Length)) != 0)
{
//Do your work here
fsOutputFile.Write(buffer, 0, num);
}
请注意, Read
需要在要填充的数组中填充 偏移量 (这是应放置字节的数组的偏移量,以及要读取的(最大) 字节数 )。
您的Read
调用应该是Read(btInputBlock, 0, intBytesToRead)
。 第二个参数是要开始写入字节的数组的偏移量。 同样,对于Write
你想Write(btInputBlock, 0, n)
作为第二个参数是数组中开始写字节的偏移量。 你也不需要调用Close
因为using
会为你清理FileStream
。
using (FileStream fsInputFile = new FileStream(strInputFileName, FileMode.Open, FileAccess.Read))
{
int intBytesToRead = 1024;
byte[] btInputBlock = new byte[intBytesToRead];
while (fsInputFile.Postion < fsInputFile.Length)
{
int n = fsInputFile.Read(btInputBlock, 0, intBytesToRead);
intTotalBytesRead += n;
fsOutputFile.Write(btInputBlock, 0, n);
}
}
链接地址: http://www.djcxy.com/p/46745.html
上一篇: C# Filestream Read