内存映射 access数据库 疑难???跪求解答 - C++ Builder / Windows SDK/API
各位大哥好,我用内存映射的方式将软件的access数据库复制了一份
复制虽然成功了,但复制出来的access数据库中有一些表打开会出错。。
错误是:
“不可识别的数据库格式 ‘D:\dbbak\emr.mdb’”
实在想不出来是哪里出问题了???
我用copyfile的方式复制出来的access数据库就可以正常使用
但copyfile实在太慢了,所以想用内存映射解决问题...
附代码:
void __fastcall TForm1::btn1Click(TObject *Sender)
{
CBackup *cbackup = new CBackup();
cbackup->DBBackup("F:\\emr_srichview4.4.\\debug\\emr.mdb","D:\\dbbak\\emr.mdb");
}
void CBackup::DBBackup(AnsiString sdbfile,AnsiString ddbfile)
{
HANDLE shFile = CreateFile(sdbfile.c_str(),GENERIC_READ,FILE_SHARE_READ ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(shFile == INVALID_HANDLE_VALUE)
{
ShowMessage( "Could not open file. "); // process error
return;
}
DWORD FileSize = GetFileSize(shFile,NULL);
DWORD TotalSize = 1024*1024*1024*4+FileSize;
HANDLE shFileMap = CreateFileMapping(shFile,NULL,PAGE_READONLY,0,FileSize,NULL);
CloseHandle(shFile);
HANDLE dhFile = CreateFile(ddbfile.c_str(),GENERIC_WRITE|GENERIC_READ,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if (dhFile == INVALID_HANDLE_VALUE)
{
ShowMessage( "Could not open file. "); // process error
return;
}
HANDLE dhFileMap = CreateFileMapping(dhFile,NULL,PAGE_READWRITE,0,FileSize,NULL);
CloseHandle(dhFile);
const long BufferSize = 1024*1024*64;
DWORD StartPos =0;
DWORD MapSize = BufferSize;
while(StartPos<TotalSize)
{
if(StartPos + BufferSize >TotalSize)
{
MapSize = TotalSize - StartPos;
}
PVOID spvFile = MapViewOfFile(shFileMap,FILE_MAP_READ,StartPos,StartPos,MapSize);
PVOID dpvFile = MapViewOfFile(dhFileMap,FILE_MAP_WRITE,StartPos,StartPos,MapSize);
memcpy(dpvFile,spvFile,MapSize);
StartPos += MapSize;
UnmapViewOfFile(spvFile);
UnmapViewOfFile(dpvFile);
}
// 关闭文件映射对象
CloseHandle(shFileMap);
CloseHandle(dhFileMap);
}
[解决办法]
楼主这样改
PVOID spvFile = MapViewOfFile(shFileMap,FILE_MAP_READ,0,StartPos,MapSize);
PVOID dpvFile = MapViewOfFile(dhFileMap,FILE_MAP_WRITE,0,StartPos,MapSize);