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

下一篇: Convert bytes to pdf using itextsharp and asp.net