想用内存映射文件加、解密大文件,但是对这个内存映射文件实在了解的不多,请指教!原来采用的方法是每次从原文件中读出固定字节的数据,加密,把加密后的数据写入到新建的文件中(也就是加密后的文件),现在改用内存映射文件不知道怎么做,是不是也应该一块一块地加密文件呀?可怎样把文件的一部份读出来?怎样控制读出的位置?操作方式和一般的文件读、写有什么区别吗?
只知道开始用这两个函数:
HANDLE hFile =
CreateFile(oldfile, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE hFileMap =
CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwFileSize + sizeof(WCHAR),NULL);
char * lpMapAddress;
lpMapAddress = (char *)
MapViewOfFile(hMapFile, // Handle to mapping object.
FILE_MAP_ALL_ACCESS,// Read/write permission
0, // Max. object size.
0, // Size of hFile.
0);
用指针lpMapAddress处理文件数据,比如char ch=*lpMapAddress就从文件中读取一个字节,*lpMapAddress=ch相当于写入一个字节。FlushViewOfFile可以真正写入数据到文件。
根据msdn的说法,file mapping是可以提高文件读写的速度。调用MapViewOfFile之后,可以看作是,虚拟内存从lpMapAddress地址开始的,大小等于dwFileSize的一个连续的内存空间的内容,和文件的内容一一对应,比如,从(lpMapAddress+368)对应文件的第368字节的数据,char ch=*(lpMapAddress+368)相当于读取第368字节到ch中,而*(lpMapAddress+368)=3相当于把3写到文件的第368字节中。所以另外一个好处是,你可以直接操作内存来读写文件,不需要分配额外的缓冲区来保存从文件中读取的内容,也不需要额外的写操作把缓冲区写入文件。
加密可以这样:比如需要从文件第192字节开始,加密100个8字节数据:
假设对内存数据加密函数c把内存pData中的数据加密后,写入pData:
__int64 * pData=(__int64 *)(lpMapAddress+192);
int i;
for(i=0;i<100;i++)
{
c(pData);
pData++;
}
这样,虽然是内存操作,文件相应内容也会同时改变。
转载于:https://www.cnblogs.com/henryzc/archive/2005/11/05/269357.html