ÔÚWindowsÏÂC++ʵÏÖUNIXÖеÄGZ¸ñʽµÄ½âѹËõ(Ò»)

2014-11-24 13:01:23 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 5

ÌìÔÚ×öÏîÄ¿ÖÐÓöµ½Ò»¸öÎÊÌ⣬ÏîÄ¿ÖÐÐèÒª¿ª·¢Ò»¸öPC¹¤¾ß£¨ÒªÇóÊÇWindows£©£¬ÆäÖÐÐèÒª½«Ò»Ð©Îļþ´ò°ü³ÉgzÎļþ£¬gzÎļþÊÇUNIXϵͳÖеÄѹËõÎļþ£¬ºóÀ´ÕÒÁËÕÒÍøÉϵÄ×ÊÔ´£¬Ö»ÓнâѹµÄC++Ô´Â룬ûÓиæËßÄãÈçºÎ½øÐÐGZ¸ñʽµÄѹËõ£¬µ±È»ÁË£¬Ä㻹¿ÉÒÔʹÓÃ7ZÈí¼þ¶ÔÎļþ½øÐÐGZ½âѹËõ¡£¶ø±¾ÆªÎÄÕ½«ÓÃÁíÍâÒ»¸ö˼·ȥʵÏÖGZ¸ñʽµÄ½âѹËõ¡£

Ê×ÏÈ£¬´´½¨Ò»¸öC++µÄ¹¤³ÌÏîÄ¿£¬ÕâÀïʹÓÃMFC´°ÌåÏîÄ¿¡£

¹¦Äܼܺòµ¥£¬ÏÈ¿´ÏÂÕû¸ö´°ÌåÉè¼Æ£º

image

ÉÏÃæÒ»ÅÅͨ¹ý¡°Ñ¡ÔñÎļþ¡±ÔÚÏÂÃæµÄÁбíÖÐÏÔʾÎļþ·¾¶£¬È»ºóͨ¹ý¡°Ñ¹Ëõ¡±°´Å¥£¬±£´æµ½Ö¸¶¨µÄĿ¼ÖС£

image

ÏÂÃæÒ»ÅÅͨ¹ý¡±Ñ¡ÔñÎļþ¡±Ñ¡Ôñgz¸ñʽµÄѹËõ°ü£¬È»ºóͨ¹ý¡°½âѹ¡±°´Å¥£¬±£´æµ½Ö¸¶¨µÄĿ¼ÖС£¡¢

image

½çÃæµÄ¹¦ÄܾÍÊÇÕâÑù£¬ÏÂÃæÎÒÀ´½éÉÜÏÂһЩÖ÷ÒªºËÐĵŦÄÜ¡£

Ê×ÏÈ£¬À´¿´GZµÄÒ»¸ö´¦ÀíÀࣺ

GZHelper.h Í·Îļþ

//GZ½âѹËõÀࣨÅäºÏtar.exeµÄ¿ÉÖ´ÐÐÎļþ£©
class GZHelper
{
public:
GZHelper();
virtual ~GZHelper();
static void Compress(char* gzFilePath, int fileNum, char* file, ...); //ѹËõ£¬£¨Ñ¹Ëõ°ü·¾¶£¬Îļþ¸öÊý£¬¿É±ä²ÎÊýµÄÎļþÁÐ±í£©
static void Compress(char* gzFilePath, int fileNum, char** files); //ѹËõ£¬£¨Ñ¹Ëõ°ü·¾¶£¬Îļþ¸öÊý£¬ÎļþÁÐ±í£©
static void Decompress(char* folderPath, char* gzFilePath); //½âѹ£¬£¨½âѹĿ¼£¬ ѹËõ°ü·¾¶£©

private:
static CString ConvertToUnix(CString winFile); //½«WindowÉϵÄ·¾¶¸ñʽת»»ÎªUNIX·¾¶¸ñʽ
static void FindFile(CString path, CString outPath); //±éÀúĿ¼£¬²¢½«Ä¿Â¼ÖеÄËùÓÐÎļþÒÆ¶¯µ½outPathÖÐ
};GZHelper.cpp

void GZHelper::Compress(char* gzFilePath, int fileNum, char* file, ...)
{
va_list argptr;

va_start(argptr, gzFilePath);
va_arg(argptr, int);

char** files;
files = new char*[fileNum];
for(int index = 0; index < fileNum; index++)
{
char* file = va_arg(argptr, char*);
CString str_file;
str_file = file;

files[index] = new char[str_file.GetLength()];
memcpy(files[index], file, str_file.GetLength());
files[index][str_file.GetLength()] = 0;
}
va_end(argptr);

Compress(gzFilePath, fileNum, files);
}

void GZHelper::Compress(char* gzFilePath, int fileNum, char** files)
{
CString str_gzFilePath(gzFilePath);
CString folderPath = str_gzFilePath.Left(str_gzFilePath.ReverseFind(\) + 1);
CString command = "cd ";
command = command + Path::StartupPath() + "tar && " + Path::GetDrive() + " && tar.exe zcPf ";
CString unix_str_gzfile = ConvertToUnix(str_gzFilePath);
command = command + """ + unix_str_gzfile + "" ";
for(int index = 0; index < fileNum; index++)
{
char* file = files[index];
CString str_file;
str_file = file;
CString unix_str_file = ConvertToUnix(str_file);
command = command + """ + unix_str_file + "" ";
}

//Ö´ÐÐÃüÁî
system(command);
}

void GZHelper::Decompress(char* folderPath, char* gzFilePath)
{
CString str_folderPath(folderPath);
CString str_gzFilePath(gzFilePath);
CString command = "cd ";
command = command + Path::StartupPath() + "tar && " + Path::GetDrive() + " && tar.exe zxvf ";
CString unix_str_gzfile = ConvertToUnix(str_gzFilePath);
command = command + """ + unix_str_gzfile + "" ";

system(command);

CString outPath = str_folderPath + "\demo";
CreateDirectory(outPath, NULL);

CString inPath = Path::StartupPath() + "tar\cygdrive";
GZHelper::FindFile(inPath, outPath);

RemoveDirectory(inPath);
}

// ½«Windowsϵķ¾¶×ª»»ÎªUNIX·¾¶
CString GZHelper::ConvertToUnix(CString winFile)
{
CString unixFile;
unixFile = winFile;
unixFile.Replace("\", "/");
unixFile = "/cygdrive/" + unixFile.Mid(0, 1) + unixFile.Mid(2, unixFile.GetLength() - 2);
return unixFile;
}

void GZHelper::FindFile(CString path, CString outPath)
{
CString szDir = path + "\*.*";

CFileFind fileFind;
BOOL result = fileFind.FindFile(szDir);

while(result)
{
result = fileFind.FindNextFile();

if(fileFind.IsDots())
continue;

if(fileFind.IsDirectory())
{
GZHelper::FindFile(fileFind.GetFilePath(), outPath);
}
else
{
//ÒÆ¶¯Îļþ
MoveFile(fileFind.GetFilePath(),