// 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;
}