从驱动器读取大部分文件

时间:2011-03-06 03:58:09

标签: c# file data-access

我正在使用C#中的大文件(可以达到可用内存的20%-40%)而且我只需要将一小部分文件一次加载到内存中(例如1-2%)的文件)。我在想使用FileStream是最好的选择,但是idk。我需要给出一个起点(以字节为单位)和一个长度(以字节为单位)并将该区域复制到byte []中。可能需要在线程之间共享对文件的访问,并且该文件将位于文件中的随机位置(非线性访问)。我也需要快速。

该项目已经有unsafe个方法,所以请随意从C#更危险的一面提出建议

3 个答案:

答案 0 :(得分:5)

FileStream将允许您搜索所需文件的部分,没问题。这是在C#中使用它的推荐方法,而且速度很快。

线程之间的共享:您需要创建一个锁,以防止其他线程在您尝试从中读取时更改FileStream位置。最简单的方法:

//  This really needs to be a member-level variable;
private static readonly object fsLock = new object();

//  Instantiate this in a static constructor or initialize() method
private static FileStream fs = new FileStream("myFile.txt", FileMode.Open);


public string ReadFile(int fileOffset) {

    byte[] buffer = new byte[bufferSize];

    int arrayOffset = 0;

    lock (fsLock) {
        fs.Seek(fileOffset, SeekOrigin.Begin);

        int numBytesRead = fs.Read(bytes, arrayOffset , bufferSize);

        //  Typically used if you're in a loop, reading blocks at a time
        arrayOffset += numBytesRead;
    }

    // Do what you want to the byte array and return it

}

根据需要添加try..catch语句和其他代码。无论你到哪里访问这个FileStream,都要锁定成员级变量fsLock ...这会阻止其他方法在你尝试阅读时读取/操作文件指针。

速度方面,我认为你会发现你受到磁盘访问速度的限制,而不是代码。

您必须考虑有关多线程文件访问的所有问题...谁初始化/打开文件,谁关闭它等等。有很多理由可以覆盖。

答案 1 :(得分:1)

我对这些文件的结构一无所知,但是使用FileStream或类似的声音读取文件的一部分听起来是最好和最快的方式。

您不需要复制byte [],因为FileStream可以直接读入字节数组。

听起来您可能对文件的结构有了更多了解,这也可能带来其他技术。但是如果你只需要阅读文件的一部分,那么这可能就是这样做的。

答案 2 :(得分:0)

如果您正在使用.Net 4,请查看System.IO.MemoryMappedFiles命名空间中的内存映射文件。

它们非常适合从大文件中读取小块。有samples in the MSDN documentation

您也可以在早期版本的.Net中执行此操作,但是您需要包装Win32 API(或使用http://winterdom.com/dev/net),