zoukankan      html  css  js  c++  java
  • 利用虚拟映射文件加密大文件

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

  • 相关阅读:
    使用electron+vue开发一个跨平台todolist(便签)桌面应用
    初识ABP vNext(12):模块的独立运行与托管
    【老孟Flutter】41个酷炫的 Loading 组件库
    【Flutter 实战】酷炫的开关动画效果
    【老孟Flutter】自定义文本步进组件
    【老孟Flutter】6种极大提升Flutter开发效率的工具包
    【Flutter 实战】pubspec.yaml 配置文件详解
    Flutter 1.22版本新增的Button
    【Flutter 混合开发】添加 Flutter 到 iOS
    【Flutter 混合开发】添加 Flutter 到 Android Fragment
  • 原文地址:https://www.cnblogs.com/freebird92/p/9833483.html
Copyright © 2011-2022 走看看