小弟最近写了个程序,需要读取整个硬盘或者某个逻辑盘的全部数据进行分析,用了createfile()和readfile()进行读取,速度相当慢,请问有没有好一些的方法来提高速度,谢谢!!!

解决方案 »

  1.   

    先malloc一个比较大的空间p
    打开一个文件,判断文件大小,如果小于p的尺寸,则直接一次性全部读入到p中。
    如果大于p的尺寸,则重新分配p,然后再一次性全部读入。
    因为多次malloc是很耗时间的。一个文件每次只读一小部分,也是很慢的。另外也可以考虑用文件内存映射的方式。但不知道文件内存映射的底层实现模式,所以多次创建内存映射,不知道效率如何。你可以试验一下。
      

  2.   

    谢whg01
    本打算使用内存映射文件的方法,但Createfile生成的句柄传入到createfilemapping中总是返回无效的句柄,GetlastError获得的是1400,请问是什么原因呢?
    程序如下:
    HANDLE hFile = CreateFile("\\\\.\\PHYSICALDRIVE0",GENERIC_READ|GENERIC_WRITE,     
    FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); if(hFile == INVALID_HANDLE_VALUE)
    {
    MessageBoxA("创建文件对象失败","错误",0);
    return ;
    }
    HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 1000, NULL);
    if(hFileMap == NULL)
    {
    MessageBoxA("创建文件映射对象失败","错误",0);        }
      

  3.   

    你这个是在Windows上吗?
    我在VS2008上试了一下,就是你这段代码,打开本地、别的机器共享文件都没问题。
      

  4.   

    是在WINDOWS下呀,而且也是VS2008,可我这里怎么是返回1400错误呢?奇怪呀
    如果把physicaldrive0换成是硬盘上的文件就能正常执行,我想要的是读取整个硬盘或某个逻辑盘的数据,在CREATEFILEMAPPING()中的HANDLE传的是硬盘或逻辑盘的句柄。
      

  5.   

    CreateFile只支持文件吧?你确定可以用CreateFile去打开逻辑盘?我印象中是不可以的。
      

  6.   

    哦,我检验了一下,读取的速度还是挺快的,谢谢楼上提醒。
    问题是出在了程序的其他地方。我的目的上从硬盘读取的数据中进行查找字符串的操作。于是把从编辑框中获得的字符串(包括中英文字符转换为16进制),又把硬盘获取的数据也转换成16进制,然后再CString中进行查找,这样应该是慢的原因,可怎么进行优化呢?程序如下:
    BYTE szOverBuffer[512*NumSector] = {0};
    ReadSectors(0,0,NumSector, szOverBuffer);//读取NumSector个扇区的数据放在szOverBuffer中
    CString content,temp;
    for(int i=0;i<512*NumSector;i++)
    {
    temp.Format("%x",szOverBuffer[i]);
    content+=temp;
    }
                     //下面是循环从content中进行查找,显示在列表框中
                       for(            )
                    {
                           content.find()
                    } 这样做,确实很费时间,有没有更好的方法,谢谢!!!!
      

  7.   

    小弟编程经验比较欠缺,开始想着是把扇区内容和要查找的内容都转换成16进制,然后用CString的find函数实现起来比较容易,现在看来反倒是效率下降了很多。直接在BYTE数组里查找是不是速度更快呢?优化的算法有没有?还有就是在将字符串转换为UNICODE是为什么英文字符转换完毕还是单字节的形式,不如a的ASCII是61,转换成UNICODE后还是61,不是61 00呢?用的函数是CString的AllocSysString()函数,用WideCharToMultiByte()的结果相似。谢谢!
      

  8.   

    不用做任何转换就行,CString的find函数是已经经过优化过的,肯定比你自己优化要强的多!
    呵呵,楼主多想了
      

  9.   

    可是,有byte数组很大时,转换为CString也需要很长时间呢?我现在想直接在Byte数组里进行查找,不转换为CString了,不知道会不会提高点速度。
      

  10.   

    你的Byte数组有多大?K、M、G?还是T啊?可以这样赋值能够提高速度 CString str(lpByteBuffer, buflen);至于自己实现完全没必要
    再说了,你的查找算法会比微软的那些牛人们写的还牛吗?呵呵
      

  11.   

    是这样,你用过Winhex吗?它在显示硬盘内容的时候速度特别快,我也想做个那样的东东,同时实现数据的查找功能,因为要搜索的字符串牵扯到不同的字符集,所以想把要搜索的字符串统一转换成十六进制放到一个CString变量里,然后把提取的硬盘内容也转换成十六进制放在CString变量里,然后在此串里进行查询,显示查询结果。
    字符串转换得到的是BYTE类型的数组
    整个过程的时间很多浪费在了BYTE->CString和在CString中进行的搜索。
    在你看来怎么做才比较快速呢?