#include <iostream>
#include <Windows.h>
#include <string>
#include <zlib.h>
#include <cstring>
#include <../minizip/zip.h>
#include <../minizip/unzip.h>
#include "timer/timer.h"
#include "timestamp/timestamp.h"
#include <filesystem>
#include "calAngle.h"
#pragma warning(disable:4996)
namespace fs = std::filesystem ;
using std::cout;
using std::endl;
// 向zip文件添加新文件
bool addFileToZip(zipFile zfile, const std::string& fileNameinZip, const std::string& srcfile)
{
if (NULL == zfile || fileNameinZip.empty()/* || srcfile.empty()为空代表空目录*/)
{
return 0;
}
int nErr = 0;
zip_fileinfo zinfo = { 0 };
tm_zip tmz = { 0 };
zinfo.tmz_date = tmz;
zinfo.dosDate = 0;
zinfo.internal_fa = 0;
zinfo.external_fa = 0;
char sznewfileName[MAX_PATH] = { 0 };
memset(sznewfileName, 0x00, sizeof(sznewfileName));
strcat_s(sznewfileName, fileNameinZip.c_str());
if (srcfile.empty())
{
strcat_s(sznewfileName, "\\");
}
// 打开zip内的文件
nErr = zipOpenNewFileInZip(zfile, sznewfileName, &zinfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_NO_COMPRESSION);
if (nErr != ZIP_OK)
{
return false;
}
if (!srcfile.empty())
{
//打开源文件
FILE* srcfp = _fsopen(srcfile.c_str(), "rb", _SH_DENYNO);
if (NULL == srcfp)
{
std::cout << "Open source file failed." << std::endl;
return false;
}
//读入源文件写入zip文件
int numBytes = 0;
char* pBuf = new char[1024 * 800];
if (NULL == pBuf)
{
std::cout << "new buffer failed." << std::endl;
return 0;
}
while (!feof(srcfp))
{
memset(pBuf, 0x00, sizeof(pBuf));
numBytes = (int)fread(pBuf, 1, sizeof(pBuf), srcfp);
nErr = zipWriteInFileInZip(zfile, pBuf, numBytes);
if (ferror(srcfp))
{
break;
}
}
delete[] pBuf;
fclose(srcfp); // 关闭源文件
}
// 关闭zip内的文件
zipCloseFileInZip(zfile);
return true;
}
void testZlib()
{
// 创建zip
zipFile zfile = zipOpen("testZip.zip", 0);
// 向zip文件添加新文件
RBRJ::Timer timer;
RBRJ::Timer timerAll;
for (int i = 0; i < 60; i++)
{
std::string fileName = "test_" + std::to_string(i);
addFileToZip(zfile, fileName, "test.png");
if (i % 10 == 1)
{
cout << "addFileToZip is running: " << i << " cost: " << timer.elapsed() << endl;
timer.reset();
}
}
// 关闭zip文件
zipClose(zfile, 0);
cout << "testZlib all cost: " << timerAll.elapsed() << endl;
}
void fileMap()
{
#if 1
// 当然,也可以通过如下代码来动态获取当前操作系统的分配粒度:
SYSTEM_INFO sinf;
GetSystemInfo(&sinf);
DWORD dwAllocationGranularity = sinf.dwAllocationGranularity;
// 设定大小、偏移量等参数
__int64 qwFileSize = 0x4000000;
__int64 qwFileOffset = 0;
__int64 T = 600 * sinf.dwAllocationGranularity;
DWORD dwBytesInBlock = 1000 * sinf.dwAllocationGranularity;
// 创建文件内核对象,其句柄保存于hFile
HANDLE hFile = CreateFile("tmp.txt",
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
// 创建文件映射内核对象,句柄保存于hFileMapping
HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE,
0, 0x4000000, NULL); // 64M
// 释放文件内核对象
CloseHandle(hFile);
// 将文件数据映射到进程的地址空间
PBYTE pbFile = (PBYTE)MapViewOfFile(hFileMapping,
FILE_MAP_ALL_ACCESS,
(DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF), dwBytesInBlock);
// 从图片文件中读取数据
std::string srcfile = "test.png";
if (srcfile.empty())
{
cout << "srcfile is empty" << endl;
exit(-1);
}
int numBytes = 0;
const int pBufSize = 1024 * 800;
char* pBuf = new char[pBufSize]; // 800k
if (!srcfile.empty())
{
//打开源文件
FILE* srcfp = _fsopen(srcfile.c_str(), "rb", _SH_DENYNO);
if (NULL == srcfp)
{
std::cout << "Open source file failed." << std::endl;
return;
}
//读源文件
//int numBytes = 0;
//char* pBuf = new char[pBufSize]; // 800k
if (NULL == pBuf)
{
std::cout << "new buffer failed." << std::endl;
return;
}
memset(pBuf, 0x00, pBufSize);
numBytes = (int)fread(pBuf, 1, pBufSize, srcfp);
cout << "numBytes: " << numBytes << endl;
fclose(srcfp); // 关闭源文件
}
RBRJ::Timer timerAll;
// 向zip文件中写入数据
RBRJ::Timer timer;
for(int i = 0; i < 60; i++)
{
memcpy(pbFile + qwFileOffset, pBuf, pBufSize);
qwFileOffset += pBufSize;
//// 当数据写满60%时,为防数据溢出,需要在其后开辟一新的映射视图
//if (qwFileOffset > T)
//{
// T = qwFileOffset + 600 * sinf.dwAllocationGranularity;
// UnmapViewOfFile(pbFile);
// pbFile = (PBYTE)MapViewOfFile(hFileMapping,
// FILE_MAP_ALL_ACCESS,
// (DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF), dwBytesInBlock);
//}
// 计时
if (i % 10 == 1)
{
cout << "addFileToZip is running: " << i << " cost: " << timer.elapsed() << endl;
timer.reset();
}
}
// 清空缓存区
delete[] pBuf;
//// 从进程的地址空间撤消文件数据映像
//UnmapViewOfFile(pbFile);
//// 关闭文件映射对象
//CloseHandle(hFileMapping);
/*******************处理实际大小********************/
#if 1
timer.reset();
// 创建和打开一个内核文件对象
HANDLE hFile2 = CreateFile("testZip.txt",
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
// 为内核文件对象 创建一个文件映射 并告诉系统文件的尺寸以及访问文件的方式
//CreateFileMapping();
// 以实际数据长度创建另外一个文件映射内核对象
HANDLE hFileMapping2 = CreateFileMapping(hFile2,
NULL,
PAGE_READWRITE,
0,
(DWORD)(qwFileOffset & 0xFFFFFFFF),
NULL);
// 将内核文件映射对象 添加到 进程中
//MapViewOfFile();
// 然后 程序就可以通过指针进行常规文件的读取了,和操作文件一样。
// 最后,用完还得回收,先用 UnmapViewOfFile() 将释放映射内核对象指针,
// 然后通过 CloseHandle 关闭之前创建的文件映射内核对象句柄和文件内核对象句柄。
// 关闭文件内核对象
CloseHandle(hFile2);
// 将文件数据映射到进程的地址空间
LPVOID pbFile2 = (PBYTE)MapViewOfFile(hFileMapping2,
FILE_MAP_ALL_ACCESS,
0, 0, qwFileOffset);
// 将数据从原来的内存映射文件复制到此内存映射文件
memcpy(pbFile2, pbFile, qwFileOffset);
//从进程的地址空间撤消文件数据映像
UnmapViewOfFile(pbFile);
UnmapViewOfFile(pbFile2);
// 关闭文件映射对象
CloseHandle(hFileMapping);
CloseHandle(hFileMapping2);
// 删除临时文件
DeleteFile("tmp.txt");
cout << "save file cost: " << timer.elapsed() << endl;
#endif
cout << "fileMap all cost: " << timerAll.elapsed() << endl;
#endif
}
#include <opencv2/opencv.hpp>
void normalSaveFile(int count)
{
// 打开源文件
cv::Mat image = cv::imread("test.png");
// 保存文件
RBRJ::Timer