最近准备做一个用户端 异常收集的程序  需要收集用户机器的程序日志和相关信息 准备打包发回来  所以研究了一下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]70. Climbing Stairs爬楼梯

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  2. stark组件开发之编辑功能实现

    编辑功能.和添加一样! 唯一不同的就是, 需要编辑一个指定的  记录.这就需要,在列表页面, 渲染编辑的时候,添加一个 id 值: class UserInfoHandler(StartHandler ...

  3. python小练习1:设计这样一个函数,在桌面的文件夹上创建10个文本,以数字给它们命名。

    python小练习1:设计这样一个函数,在桌面的文件夹上创建10个文本,以数字给它们命名. 使用for循环即可实现: for name in range(1,11): desktop_path='C: ...

  4. 正则RegExp的懒惰性和贪婪性; 分组捕获;

    1.正则的懒惰性??? 每次在它的方法exec中捕获的时候,只捕获第一次匹配的内容,而不往下捕获,我们把这种情况称为正则的懒惰性 且每一次捕获的位置都是从索引0开始 正则的实例对象上有一个lastin ...

  5. Difference between MB Star C3 and MB Star C4

    Many times ago, i saw a blog about MB sd connect C4 for benz, the author said he like this tool very ...

  6. js 定时更改div背景图片

    今天遇到一个业务场景,使用js将一个div标签的背景图片定时更换一下. 之前百度了几个,有css+js,也有css3的,不过css3的兼容有问题,之后同事提示,可以使用js直接来更换div的北京图片, ...

  7. ABP框架系列之三十八:(NHibernate-Integration-NHibernate-集成)

    ASP.NET Boilerplate can work with any O/RM framework. It has built-in integration with NHibernate. T ...

  8. python repr()和str()

    两者功能差不多,都是把对象转为字符串表示形式,但是也有区别,repr()之后再eval()可以转为原型,但str()只能保证大多数,不能100% 其中主要的 差别在与 字符串对象本身,比如 a = ' ...

  9. shell脚本学习- 传递参数

    跟着RUNOOB网站的教程学习的笔记 我们可以在执行shell脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n代表一个数字,1为执行脚本的第一参数,2为执行脚本的第二个参数,以此类推... 实 ...

  10. JavaWeb核心之Servlet

    servlet规范:包含三个技术点 1)servlet技术 2)filter技术---过滤器 3)listener技术---监听器 Servlet快速入门 实现步骤: 1)创建类实现Servlet接口 ...