我以前写一个程序要用到压缩,我选择了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是我写的一个类。