最近准备做一个用户端 异常收集的程序  需要收集用户机器的程序日志和相关信息 准备打包发回来  所以研究了一下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. 186. Reverse Words in a String II 翻转有空格的单词串 里面不变

    [抄题]: Given an input string , reverse the string word by word. Example: Input: ["t"," ...

  2. java_20 LinkedList类

    LinkedList类特有的方法 (1)addLast()  将指定元素添加到此列表的结尾. addFirst() 将指定元素添加到此列表的开始. public static void main(St ...

  3. 本机连接Spark Standalone--最简单的spark调试方式

    为了既能远程连接spark  查看ui  又能本地练习  安装简单 去官网  http://spark.apache.org/downloads.html  选择对应版本下载 tar包 解压 tar ...

  4. 第一次在线latex的使用

    发现了一个神奇的网站,overleaf 以下是基于默认模板写的. \documentclass[a4paper]{article} %% Language and font encodings \us ...

  5. BZOJ4380 Myjnie / Luogu3592 [POI2015]MYJ-区间DP

    Description 有$n$家洗车店从左往右排成一排,每家店都有一个正整数价格$p[i]$. 有$m$个人要来消费,第$i$个人会驶过第$a[i]$个开始一直到第$b[i]$个洗车店,且会选择这些 ...

  6. Linux环境下java开发环境搭建一 JDK搭建

    第一步:下载jdk压缩文件 第二步:上传到家目录下的soft目录下,可以采用winscp,此处下载的是.tar.gz文件 第三步:解压压缩文件,并在/usr/local目录下创建一个jdk7的目录,并 ...

  7. 登录服务器失败 IP 统计和处理方法

    一.登录ssh失败次数统计 1)错误的打开方式 awk '/Failed password/ {print $(NF-3)}' secure |sort -n |uniq -c|sort -n |ta ...

  8. 做到让DBCP连接池不超时

    前些天部署了一个项目,但每次隔一段时间打开都会报如下所示的错误:  javax.servlet.ServletException: org.springframework.transaction.Ca ...

  9. 【UWP】手动实现 WebAuthenticationBroker

    在 UWP 中,如果要进行 OAuth 授权,那很大概率是会用上 WebAuthenticationBroker 这个类的,例如微博授权这种. 在一般情况下来说,WebAuthenticationBr ...

  10. [Project] SpellCorrect源码详解

    该Project原来的应用场景是对电商网站中输入一个错误的商品名称进行智能纠错,比如iphoae纠错为iphone.以下介绍的这个版本对其作了简化,项目源代码地址参见我的github:https:// ...