如何将7z的压缩源码加入自己的程序中
2010-01-06 11:45
239 查看
我以前写一个程序要用到压缩,我选择了7z。
原因很简单,他的压缩率高。
7z提供的文档上的方法只能是单文件的。
对于压缩好的文件夹或要压缩文件夹没提供函数直接调用。
我现提供一种方法,就是将7z编译为静态库。
要修改的有:
原MainAr.cpp第改为:
extern int Main2(
#ifndef _WIN32
int numArguments, const char *arguments[]
#endif
);
static const char *kExceptionErrorMessage = "/n/nError:/n";
static const char *kUserBreak = "/nBreak signaled/n";
static const char *kMemoryExceptionMessage = "/n/nERROR: Can't allocate required memory!/n";
static const char *kUnknownExceptionMessage = "/n/nUnknown Error/n";
static const char *kInternalExceptionMessage = "/n/nInternal Error #";
int MY_CDECL main
(
#ifndef _WIN32
int numArguments, const char *arguments[]
#endif
)
{
g_StdStream = &g_StdOut;
#ifdef _WIN32
改为:
extern int Main2(
UStringVector commandStrings
#ifndef _WIN32
int numArguments, const char *arguments[]
#endif
);
static const char *kExceptionErrorMessage = "/n/nError:/n";
static const char *kUserBreak = "/nBreak signaled/n";
static const char *kMemoryExceptionMessage = "/n/nERROR: Can't allocate required memory!/n";
static const char *kUnknownExceptionMessage = "/n/nUnknown Error/n";
static const char *kInternalExceptionMessage = "/n/nInternal Error #";
int MY_CDECL __main_lib
(
UStringVector commandStrings
#ifndef _WIN32
int numArguments, const char *arguments[]
#endif
)
{
g_StdStream = &g_StdOut;
原Main.cpp 第181-247行为:
const char *kUnsupportedArcTypeMessage = "Unsupported archive type";
int Main2(
#ifndef _WIN32
int numArguments, const char *arguments[]
#endif
)
{
#ifdef _WIN32
SetFileApisToOEM();
#endif
UStringVector commandStrings;
#ifdef _WIN32
NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings);
#else
GetArguments(numArguments, arguments, commandStrings);
#endif
if(commandStrings.Size() == 1)
{
ShowCopyrightAndHelp(g_StdOut, true);
return 0;
}
commandStrings.Delete(0);
改为:
int Main2(
UStringVector commandStrings
#ifndef _WIN32
int numArguments, const char *arguments[]
#endif
)
{
//#ifdef _WIN32
//SetFileApisToOEM();
//#endif
//
//UStringVector commandStrings;
//#ifdef _WIN32
//NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings);
//#else
//GetArguments(numArguments, arguments, commandStrings);
//#endif
//wchar_t *wcc=new wchar_t[1000],*wcc2=new wchar_t[1000];
//::GetModuleFileName(NULL,wcc,MAX_PATH);
//wchar_t wslash='//';
//wchar_t * pos=wcsrchr(wcc,(int)wslash);
//wchar_t *pw=wcsncpy(wcc2,wcc,pos-wcc+1);wcc2[pos-wcc+1]=0;
SetCurrentDirectory(commandStrings[0]);//add
if(commandStrings.Size() == 1)
{
ShowCopyrightAndHelp(g_StdOut, true);
return 0;
}
commandStrings.Delete(0);
原LoadCodecs.cpp第52-67为:
#ifdef _WIN32
static LPCTSTR kRegistryPath = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-zip");
static LPCTSTR kProgramPathValue = TEXT("Path");
static bool ReadPathFromRegistry(HKEY baseKey, CSysString &path)
{
NRegistry::CKey key;
if(key.Open(baseKey, kRegistryPath, KEY_READ) == ERROR_SUCCESS)
if (key.QueryValue(kProgramPathValue, path) == ERROR_SUCCESS)
{
NName::NormalizeDirPathPrefix(path);
return true;
}
return false;
}
改为:
#ifdef _WIN32
static LPCTSTR kRegistryPath = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-zip");
static LPCTSTR kProgramPathValue = TEXT("Path");
static bool ReadPathFromRegistry(HKEY baseKey, CSysString &path)
{
//NRegistry::CKey key;
//if(key.Open(baseKey, kRegistryPath, KEY_READ) == ERROR_SUCCESS)
// if (key.QueryValue(kProgramPathValue, path) == ERROR_SUCCESS)
// {
// NName::NormalizeDirPathPrefix(path);
// return true;
// }
return true;
}
#endif
#endif
完了之后编译为lib
以后就可以类似这样在程序内部调用7z了:
__run_7z_cmd cmd2;
cmd2.Add("a");
cmd2.Add(vpass);
cmd2.Add("-y");
cmd2.Add("-mx9");
cmd2.Add(wxT(".//a.7z"));
cmd2.Exec();
__run_7z_cmd是我写的一个类。
原因很简单,他的压缩率高。
7z提供的文档上的方法只能是单文件的。
对于压缩好的文件夹或要压缩文件夹没提供函数直接调用。
我现提供一种方法,就是将7z编译为静态库。
要修改的有:
原MainAr.cpp第改为:
extern int Main2(
#ifndef _WIN32
int numArguments, const char *arguments[]
#endif
);
static const char *kExceptionErrorMessage = "/n/nError:/n";
static const char *kUserBreak = "/nBreak signaled/n";
static const char *kMemoryExceptionMessage = "/n/nERROR: Can't allocate required memory!/n";
static const char *kUnknownExceptionMessage = "/n/nUnknown Error/n";
static const char *kInternalExceptionMessage = "/n/nInternal Error #";
int MY_CDECL main
(
#ifndef _WIN32
int numArguments, const char *arguments[]
#endif
)
{
g_StdStream = &g_StdOut;
#ifdef _WIN32
改为:
extern int Main2(
UStringVector commandStrings
#ifndef _WIN32
int numArguments, const char *arguments[]
#endif
);
static const char *kExceptionErrorMessage = "/n/nError:/n";
static const char *kUserBreak = "/nBreak signaled/n";
static const char *kMemoryExceptionMessage = "/n/nERROR: Can't allocate required memory!/n";
static const char *kUnknownExceptionMessage = "/n/nUnknown Error/n";
static const char *kInternalExceptionMessage = "/n/nInternal Error #";
int MY_CDECL __main_lib
(
UStringVector commandStrings
#ifndef _WIN32
int numArguments, const char *arguments[]
#endif
)
{
g_StdStream = &g_StdOut;
原Main.cpp 第181-247行为:
const char *kUnsupportedArcTypeMessage = "Unsupported archive type";
int Main2(
#ifndef _WIN32
int numArguments, const char *arguments[]
#endif
)
{
#ifdef _WIN32
SetFileApisToOEM();
#endif
UStringVector commandStrings;
#ifdef _WIN32
NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings);
#else
GetArguments(numArguments, arguments, commandStrings);
#endif
if(commandStrings.Size() == 1)
{
ShowCopyrightAndHelp(g_StdOut, true);
return 0;
}
commandStrings.Delete(0);
改为:
int Main2(
UStringVector commandStrings
#ifndef _WIN32
int numArguments, const char *arguments[]
#endif
)
{
//#ifdef _WIN32
//SetFileApisToOEM();
//#endif
//
//UStringVector commandStrings;
//#ifdef _WIN32
//NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings);
//#else
//GetArguments(numArguments, arguments, commandStrings);
//#endif
//wchar_t *wcc=new wchar_t[1000],*wcc2=new wchar_t[1000];
//::GetModuleFileName(NULL,wcc,MAX_PATH);
//wchar_t wslash='//';
//wchar_t * pos=wcsrchr(wcc,(int)wslash);
//wchar_t *pw=wcsncpy(wcc2,wcc,pos-wcc+1);wcc2[pos-wcc+1]=0;
SetCurrentDirectory(commandStrings[0]);//add
if(commandStrings.Size() == 1)
{
ShowCopyrightAndHelp(g_StdOut, true);
return 0;
}
commandStrings.Delete(0);
原LoadCodecs.cpp第52-67为:
#ifdef _WIN32
static LPCTSTR kRegistryPath = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-zip");
static LPCTSTR kProgramPathValue = TEXT("Path");
static bool ReadPathFromRegistry(HKEY baseKey, CSysString &path)
{
NRegistry::CKey key;
if(key.Open(baseKey, kRegistryPath, KEY_READ) == ERROR_SUCCESS)
if (key.QueryValue(kProgramPathValue, path) == ERROR_SUCCESS)
{
NName::NormalizeDirPathPrefix(path);
return true;
}
return false;
}
改为:
#ifdef _WIN32
static LPCTSTR kRegistryPath = TEXT("Software") TEXT(STRING_PATH_SEPARATOR) TEXT("7-zip");
static LPCTSTR kProgramPathValue = TEXT("Path");
static bool ReadPathFromRegistry(HKEY baseKey, CSysString &path)
{
//NRegistry::CKey key;
//if(key.Open(baseKey, kRegistryPath, KEY_READ) == ERROR_SUCCESS)
// if (key.QueryValue(kProgramPathValue, path) == ERROR_SUCCESS)
// {
// NName::NormalizeDirPathPrefix(path);
// return true;
// }
return true;
}
#endif
#endif
完了之后编译为lib
以后就可以类似这样在程序内部调用7z了:
__run_7z_cmd cmd2;
cmd2.Add("a");
cmd2.Add(vpass);
cmd2.Add("-y");
cmd2.Add("-mx9");
cmd2.Add(wxT(".//a.7z"));
cmd2.Exec();
__run_7z_cmd是我写的一个类。
相关文章推荐
- uboot-tiny4412启动流程(下)----如何将自己的裸板测试程序加入uboot中启动测试
- 如何在tcp源码中分析丢包,加入自己的函数
- 如何在自己的程序中加入宏的功能
- 如何把自己写的程序加入到开机启动项(Windows)
- 如何把自己写的程序加入到开机启动项(Windows)
- 如何在window-based的程序中加入自己的视图与控制器类
- 自己以前用C#写的简单升级程序源码(比如更新一个安装包或者压缩文件),带进度条,支持续传
- uboot-tiny4412启动流程(下)----如何将自己的裸板测试程序加入uboot中启动测试
- uboot-tiny4412启动流程(下)----如何将自己的裸板测试程序加入uboot中启动测试
- 分享一下,如何编译自己修改的源码模块
- 如何有效防止Java程序源码被人偷窥?
- java 栈和Java基础类的Stack类的源码实现,缺陷以及如何实现自己的Stack类
- JAVA 如何反编译的自己的程序
- 在自己的程序中加入脚本支持 —— ActiveX Scripting技术
- 分析mtk6516如何加入自己的驱动
- 如何在delphi中加入自己的脚本
- 如何在程序中加入Growl通知
- 如何在程序中加入Growl通知
- 如何在程序中加入Growl通知
- 如何在程序中加入Growl通知