最近准备做一个用户端 异常收集的程序  需要收集用户机器的程序日志和相关信息 准备打包发回来  所以研究了一下7Z 文件压缩 做一个笔记吧

遇到的问题:

1:VS2008 遇到 loadlibrary 以后显示  ERROR 6034

解决方案

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'\"")

2:根据源码 没编译对正确的7z.dll

最终使用的是 7z920.tar\CPP\7zip\Bundles\Format7zF  里面编译的7z.dll

攻略:

编译DLL 的方式

由于 可以使用VS 也可以使用makefile

makefile 使用方法:1启动VS2008命令行工具 并切换到对应目录  执行 nmake 等待即可

代码demo

由于只用到压缩 就不贴解压代码了

源码自带Demo  目录 7z920.tar\CPP\7zip\UI\Client7z

源码分析:

入参:打包的文件信息列表 和目标包的 路径

DWORD ArchiveFile(CObjectVector<CDirItem> &dirItems,LPCWSTR ArchivePackPath)
{
NT_CHECK NWindows::NDLL::CLibrary lib;
if (!lib.Load(TEXT(kDllName)))//加载7z.dll
{
PrintError("Can not load 7-zip library");
return ;
}
CreateObjectFunc createObjectFunc = (CreateObjectFunc)lib.GetProc("CreateObject");//获取COM 接口
if (createObjectFunc == )
{
PrintError("Can not get CreateObject");
return ;
} UString archiveName=ArchivePackPath;//打包后的位置 //保存打包位置 COutFileStream *outFileStreamSpec = new COutFileStream;
CMyComPtr<IOutStream> outFileStream = outFileStreamSpec;
if (!outFileStreamSpec->Create(archiveName, true))//创建 打包文件
{
PrintError("can't create archive file");
return ;
} CMyComPtr<IOutArchive> outArchive; //取IOUTARCHIVE 接口
if (createObjectFunc(&CLSID_CFormat7z, &IID_IOutArchive, (void **)&outArchive) != S_OK)
{
PrintError("Can not get class object");
return ;
} CArchiveUpdateCallback *updateCallbackSpec = new CArchiveUpdateCallback; //压缩时 会调用的回调函数
CMyComPtr<IArchiveUpdateCallback2> updateCallback(updateCallbackSpec);
updateCallbackSpec->Init(&dirItems); HRESULT result = outArchive->UpdateItems(outFileStream, dirItems.Size(), updateCallback);
updateCallbackSpec->Finilize(); //压缩 if (result != S_OK)
{
PrintError("Update Error");
return ;
}
for (int i = ; i < updateCallbackSpec->FailedFiles.Size(); i++) //打印失败文件
{
PrintNewLine();
PrintString((UString)L"Error for file: " + updateCallbackSpec->FailedFiles[i]);
}
if (updateCallbackSpec->FailedFiles.Size() != )//判断有几个失败的文件
return ;
return ;
}

打包文件的获取 我自己封装了一下 又以下2种方式

一种是 打包一个文件夹 一种是通过一个文件名全路径的list 打包

 VOID GetArchiveItemFromPath(LPCTSTR strDirPath,CObjectVector<CDirItem> &dirItems)
{ NFile::NFind::CFileInfo fi;
NFile::NFind::CFindFile TEST;
AString dirPath;
dirPath=strDirPath;
dirPath+="\\*.*";
TEST.FindFirst(dirPath,fi);
while(TEST.FindNext(fi))
{
if (fi.IsDots())
{
continue;
}
CDirItem di;
di.Attrib = fi.Attrib;
di.Size = fi.Size;
di.CTime = fi.CTime;
di.ATime = fi.ATime;
di.MTime = fi.MTime;
di.Name = MultiByteToUnicodeString(fi.Name);
di.FullPath = MultiByteToUnicodeString(strDirPath);
di.FullPath+=MultiByteToUnicodeString("\\");
di.FullPath+=MultiByteToUnicodeString(fi.Name);
dirItems.Add(di);
}
}
DWORD GetArchiveItemFromFileList(CObjectVector<AString> FileList,CObjectVector<CDirItem> &ItemList)
{
NFile::NFind::CFileInfo fi;
for (int i=;i<FileList.Size();i++)
{
if (fi.Find(FileList[i]))
{
CDirItem di;
di.Attrib = fi.Attrib;
di.Size = fi.Size;
di.CTime = fi.CTime;
di.ATime = fi.ATime;
di.MTime = fi.MTime;
di.Name = MultiByteToUnicodeString(fi.Name);
di.FullPath = MultiByteToUnicodeString(FileList[i]);
ItemList.Add(di);
}
}
return ;
}
//example
/*
CObjectVector<CDirItem> ItemList;
GetArchiveItemFromPath("C:\\Users\\kr\\Desktop\\VPN",ItemList);
ArchiveFile(ItemList,L"dirPath.7Z"); CObjectVector<CDirItem> ItemList;
CObjectVector<AString> fileList;
fileList.Add("C:\\Users\\kr\\Desktop\\VPN\\VPN.txt");
fileList.Add("C:\\Users\\kr\\Desktop\\VPN.txt");
fileList.Add("C:\\Users\\kr\\Desktop\\VPN\\VPN3.txt");
GetArchiveItemFromFileList(fileList,ItemList);
ArchiveFile(ItemList,L"File.7Z");
*/

7z 程序打包 Demo的更多相关文章

  1. Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)

    Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer   Advanced Installer :Free for 30 da ...

  2. Linux应用程序打包

      原文地址:http://blog.solrex.cn/articles/packaging-1-src.html1. 应用程序打包技术之一(源代码篇) 相信很多朋友都曾经为方便做某件事写过自己的小 ...

  3. Django的安装、使用详解、自动化测试应用以及程序打包

    1.Django的安装 pip install Django 验证 Django 是否能被 Python 识别 >>> import django >>> prin ...

  4. 以向VS 程序打包集成自动写入注册表功能为例,介绍如何实现自由控制安装过程

    最近由于项目部署时需要更灵活的控制程序安装的流程以及自定义安装行为,特意研究了一下VS程序打包,把解决办法和大家分享一下. 以VS2010为例: 这是一个已经设置好最基本的Visual Studio ...

  5. VS2012程序打包部署详解

    VS2012没有自带打包工具,所以要先下载并安装一个打包工具.我采用微软提供的打包工具:  InstallShield2015LimitedEdition.下载地址:https://msdn.micr ...

  6. 他山之石——vs2013 安装与部署及程序打包

    C#打包需要这个:InstallShield 2013 Limited Edition for Visual Studio  .下载地址: InstallShield 2013 Limited Edi ...

  7. c#程序打包大全

    c#程序打包现在分为两种,一种是VS自带的打包方式,还有一种是第三方的打包方式,在VS2013里面是没有自带打包安装部署的,只有第三方的创建. 第三方打包方式很简单,百度Installshield下载 ...

  8. SNF开发平台WinForm之十一-程序打包-SNF快速开发平台3.3-Spring.Net.Framework

    原来我们用的是微软自带的打包工具去打包,但感觉好像也是第三方做的打包并且很是麻烦,还有时不成功报错.那综合考虑就找一个简单实用的打包工具吧,就找到了NSIS这个.具体打包步骤如下: 1.安装NSIS ...

  9. Android 程序打包和安装过程

    APP程序打包与安装的流程: APP的安装过程:

随机推荐

  1. [leetcode]265. Paint House II粉刷房子(K色可选)

    There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...

  2. Java 后台验证的工具类

    Java 后台验证的工具类 public class ValidationUtil {         //手机号     public static String mobile = "^( ...

  3. 【Android】异步加载布局探索

    最近在做的项目页面复杂导致布局嵌套多层,而且又使用了百分比布局(可能主要是这个原因)导致页面加载的时候主线程会被阻塞, 那要想减少主线程阻塞,一来就是简化布局,减轻LayoutInflater的负担, ...

  4. 设置angular公共样式表

    一.现象 新创建的项目,是直接显示在src目录下的,假如会用到其它第三方的全局样式时,不能统一放在一个地方统一来管理,就会感觉有点乱. 二.解决 1.移动样式表. 在assets文件夹(该文件夹一般都 ...

  5. Elasticsearch tshark 封包分析 (转)

    Elasticsearch tshark 封包分析 使用wireshark能解決許多網路問題,將側錄下來的封包傳至Elasticsearch上方便分析製作及時報表.tshark為wireshark的命 ...

  6. 如何解决XMLHttpRequest cannot load file:~~~~~~~~~~~. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-res

    原因:Chrome不支持本地Ajax请求. 解决: 右击Chrome浏览器快捷方式,选择“属性”,在“目标”中加上"--allow-file-access-from-files", ...

  7. 机器学习面试--一句话概括传统ML算法

    机器学习过程主要包括:数据的特征提取.数据预处理.训练模型.测试模型.模型评估改进等几部分 传统机器学习算法主要包括以下五类: 回归:建立一个回归方程来预测目标值,用于连续型分布预测 分类:给定大量带 ...

  8. diff 命令详解

    [自注:] 1,还有个colordiff命令,用颜色标识不同的地方.需要先安装 2,diff normal模式中 2,5表示从第二行到第五行 3,diff -c 模式中,2,5表示从第二行到第五行 4 ...

  9. http错误代码提示

    1×× 保留 2×× 表示请求成功地接收 3×× 为完成请求客户需进一步细化请求 4×× 客户错误 5×× 服务器错误 200  正常:请求已完成.  201  正常:紧接 POST 命令.  202 ...

  10. 桌面应用开发之WPF页面导航

    先看效果图 Get Start   为了项目解耦,使用mvvmlight框架.MVVM设计模式请自行了解. 1 新建项目   新建一个MvvmLight(WPF)项目,删除其中无关文件夹:Design ...