FileStream 更快地读写大文件的方法

FileStream faster way to read and write big file

我有速度和内存效率问题,我正在读取从 .bin 文件中切割大块字节然后将其写入另一个文件,问题是要读取文件我需要创建一个巨大的字节数组:

Dim data3(endOFfile) As Byte ' end of file is here around 270mb size
      Using fs As New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None)
        fs.Seek(startOFfile, SeekOrigin.Begin)
        fs.Read(data3, 0, endOFfile)
    End Using
    Using vFs As New FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\test.bin", FileMode.Create) 'save
        vFs.Write(data3, 0, endOFfile)
    End Using

所以办理时间比较长,请问有什么比较高效的方法吗? 我可以在不使用字节数组的情况下以某种方式在同一文件流中读写吗?

我从来没有这样做过,但我认为 Stream.CopyTo 方法应该是最简单的方法,而且速度最快。

Using inputStream As New FileStream(...),
      outputStream As New FileStream(...)
    inputStream.CopyTo(outputStream)
End Using

我不确定该重载是一次性读取所有数据还是使用默认缓冲区大小。如果它是前者或者你想指定一个缓冲区大小而不是默认值,那么有一个重载:

inputStream.CopyTo(outputStream, bufferSize)

您可以尝试不同的缓冲区大小,看看它是否会对性能产生影响。内存使用越小越好,但我希望内存越大越快,至少在一定程度上是这样。

请注意,CopyTo 方法至少需要 .NET Framework 4.0。如果您在 UI 线程上执行此代码,您可能希望改为调用 CopyToAsync,以避免冻结 UI。同样的两个重载可用,加上第三个接受 CancellationToken。我不会在这里教你如何使用 Async/Await,所以如果你想那样做,请自己研究一下。请注意,CopyToAsync 至少需要 .NET Framework 4.5。