利用虚拟映射文件加密大文件

// Enc.cpp : Defines the entry point for the console application.
//

include "stdafx.h"

include

include <windows.h>

include

ifdef UNICODE

define fstring std::wstring

else

define fstring std::string

endif // !UNICODE

using namespace std;

bool FileEncryption(fstring fsSrcPath)
{
//存取模式
DWORD dAccessType = (GENERIC_READ | GENERIC_WRITE);

//共享模式
DWORD dShareType = FILE_SHARE_READ | FILE_SHARE_WRITE;


// 打开文件句柄
HANDLE hFile = CreateFile(fsSrcPath.c_str()
    , dAccessType               // 访问模式
    , dShareType                // 共享模式
    , NULL
    , OPEN_EXISTING             // 如果存在则打开,否则失败
    , FILE_FLAG_OVERLAPPED      // 。。。
    , NULL);


if (hFile == INVALID_HANDLE_VALUE)
{
    cout << "文件不存在:" << fsSrcPath << endl;
    return 1;
}


DWORD dFileSize = GetFileSize(hFile, NULL);


// 创建映射句柄
HANDLE hFileMap = CreateFileMapping(hFile
    , NULL
    , PAGE_READWRITE        // 注意,和createfile要一致
    , 0
    , dFileSize
    , NULL);


if (hFileMap == NULL)
{
    cout << "创建映射句柄失败" << fsSrcPath << endl;
    CloseHandle(hFile);
    return 1;
}


CloseHandle(hFile);


// 每次取500M 这个最好不要太大500M还是过大,这儿为了说明问题,当让如果是只读的话也没有什么问题
DWORD dFileBlock = 1024 * 512; // 500k


DWORD dBegin = 0;
DWORD dLen = 0;
while (dBegin < dFileSize)
{
    if (dBegin + dFileBlock > dFileSize)
    {
        dLen = dFileSize - dBegin;
    }
    else
    {
        dLen = dFileBlock;
    }


    // 取映射句柄的某一部分,并映射到内存中,注意这是虚拟内存,实际内存中并没有文件,也就是说不管多大文件,内存占用很小
    // 当然io(磁盘使用量可能会很大)
    LPVOID pFileBlock = MapViewOfFile(hFileMap
        , FILE_MAP_ALL_ACCESS       // 注意,和createfile要一致
        , 0
        , dBegin                    // 开始位置
        , dLen);                    // 映射长度


    if (pFileBlock == NULL)
    {
        cout << "映射失败" << endl;
        CloseHandle(hFileMap);
        return 1;
    }


    for (int i = 0; i < dLen; ++i)
    {
        // 简单处理,异或一下,测试加密,这儿的读是不占电脑内存的
        char* a = (char*)pFileBlock + i;
        // 注意这而,写了内存,那么这段内存将会实际化,也就是说电脑占用的内存增加了(一共是512M),dFileBlock最好小一点
        *a = *a ^ 85;
        //*a = 'a';
    }


    // “释放”掉虚拟内存
    UnmapViewOfFile(pFileBlock);
    dBegin += dLen;
}


CloseHandle(hFileMap);
cout << "success:" << fsSrcPath << endl;

return 0;

}

int main(int argc, char* argv[])
{
// 输入文件
for (int i = 1; i < argc; i++)
{
cout << argv[i] << " ";
FileEncryption(argv[i]);
}
cout << endl << "Done" <<endl;
return 0;
}

猜你喜欢

转载自www.cnblogs.com/freebird92/p/9833483.html