小弟最近写了个程序,需要读取整个硬盘或者某个逻辑盘的全部数据进行分析,用了createfile()和readfile()进行读取,速度相当慢,请问有没有好一些的方法来提高速度,谢谢!!!
解决方案 »
- xp下图片显示清晰,在win7下显示模糊。求解。
- VC++如何提高画图效率???
- VC重绘菜单栏问题
- 求助:关于双视类的SDI静态切分问题T.T
- 如何设置使程序可以添加Active X控件?(在刚开始时设置成了不使用)
- 提问:在vc/mfc中,如何读取txt中的数据项?
- 求救~~~写了一个程序访问数据库中的一个表,发现不能现在表中中文的行
- 那里可以下载sse sdk?
- 请问要怎么用好msdn
- 如何让你的笔记本电池“死”而复生
- VS2008中MFC“资源被另一个编辑器打开”的问题
- dc.GetDeviceCaps( LOGPIXELSY ) 和 dc.GetDeviceCaps( LOGPIXELSX ) 怎么总一样
打开一个文件,判断文件大小,如果小于p的尺寸,则直接一次性全部读入到p中。
如果大于p的尺寸,则重新分配p,然后再一次性全部读入。
因为多次malloc是很耗时间的。一个文件每次只读一小部分,也是很慢的。另外也可以考虑用文件内存映射的方式。但不知道文件内存映射的底层实现模式,所以多次创建内存映射,不知道效率如何。你可以试验一下。
本打算使用内存映射文件的方法,但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); }
我在VS2008上试了一下,就是你这段代码,打开本地、别的机器共享文件都没问题。
如果把physicaldrive0换成是硬盘上的文件就能正常执行,我想要的是读取整个硬盘或某个逻辑盘的数据,在CREATEFILEMAPPING()中的HANDLE传的是硬盘或逻辑盘的句柄。
问题是出在了程序的其他地方。我的目的上从硬盘读取的数据中进行查找字符串的操作。于是把从编辑框中获得的字符串(包括中英文字符转换为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()
} 这样做,确实很费时间,有没有更好的方法,谢谢!!!!
呵呵,楼主多想了
再说了,你的查找算法会比微软的那些牛人们写的还牛吗?呵呵
字符串转换得到的是BYTE类型的数组
整个过程的时间很多浪费在了BYTE->CString和在CString中进行的搜索。
在你看来怎么做才比较快速呢?