void CommandData::ProcessCommand() { #ifndef SFX_MODULE const wchar *SingleCharCommands=L"FUADPXETK"; if (Command[0]!=0 && Command[1]!=0 && wcschr(SingleCharCommands,Command[0])!=NULL || *ArcName==0) OutHelp(*Command==0 ? RARX_SUCCESS:RARX_USERERROR); // Return 'success' for 'rar' without parameters. #ifdef _UNIX if (GetExt(ArcName)==NULL && (!FileExist(ArcName) || IsDir(GetFileAttr(ArcName)))) wcsncatz(ArcName,L".rar",ASIZE(ArcName)); #else if (GetExt(ArcName)==NULL) wcsncatz(ArcName,L".rar",ASIZE(ArcName)); #endif if (wcschr(L"AFUMD",*Command)==NULL) { if (GenerateArcName) GenerateArchiveName(ArcName,ASIZE(ArcName),GenerateMask,false); StringList ArcMasks; ArcMasks.AddString(ArcName); ScanTree Scan(&ArcMasks,Recurse,SaveSymLinks,SCAN_SKIPDIRS); FindData FindData; while (Scan.GetNext(&FindData)==SCAN_SUCCESS) AddArcName(FindData.Name); } else AddArcName(ArcName); #endif switch(Command[0]) { case 'P': case 'X': case 'E': case 'T': case 'I': { CmdExtract Extract(this); Extract.DoExtract(); } break; #ifndef SILENT case 'V': case 'L': ListArchive(this); break; default: OutHelp(RARX_USERERROR); #endif } if (!BareOutput) mprintf(L"\n"); }
void CommandData::ProcessCommand() { #ifndef SFX_MODULE if (Command[1] && strchr("FUADPXETK",*Command)!=NULL || *ArcName==0) OutHelp(); #ifdef _UNIX if (GetExt(ArcName)==NULL && (!FileExist(ArcName) || IsDir(GetFileAttr(ArcName)))) strcat(ArcName,".rar"); #else if (GetExt(ArcName)==NULL) strcat(ArcName,".rar"); #endif if (strchr("AFUMD",*Command)==NULL) { StringList ArcMasks; ArcMasks.AddString(ArcName); ScanTree Scan(&ArcMasks,Recurse,SaveLinks,SCAN_SKIPDIRS); FindData FindData; while (Scan.GetNext(&FindData)==SCAN_SUCCESS) AddArcName(FindData.Name,FindData.NameW); } else AddArcName(ArcName,NULL); #endif switch(Command[0]) { case 'P': case 'X': case 'E': case 'T': case 'I': { CmdExtract Extract; Extract.DoExtract(this); } break; #if !defined(GUI) && !defined(SILENT) case 'V': case 'L': ListArchive(this); break; default: OutHelp(); #endif } #ifndef GUI if (!BareOutput) mprintf("\n"); #endif }
void CommandData::ProcessCommand() { #ifndef SFX_MODULE const char *SingleCharCommands="FUADPXETK"; if (Command[1] && strchr(SingleCharCommands,*Command)!=NULL || *ArcName==0) OutHelp(); //get filename *ArcName #ifdef _UNIX if (GetExt(ArcName)==NULL && (!FileExist(ArcName) || IsDir(GetFileAttr(ArcName)))) strcat(ArcName,".rar"); #endif //printf("test4 %c %s\n",*Command,ArcName); //找文件,将ArcName传到FindData.Name if (strchr("AFUMD",*Command)==NULL) { StringList ArcMasks; ArcMasks.AddString(ArcName); ScanTree Scan(&ArcMasks,Recurse,SaveLinks,SCAN_SKIPDIRS); FindData FindData; while (Scan.GetNext(&FindData)==SCAN_SUCCESS) AddArcName(FindData.Name,FindData.NameW); //FindData.Name "ere.rar" } #endif switch(Command[0]) { case 'P': case 'X': case 'E': case 'T': case 'I': { printf("\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"); CmdExtract Extract; Extract.DoExtract(this); printf("\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"); } break; #ifndef SILENT case 'V': case 'L': ListArchive(this); break; default: OutHelp(); #endif } if (!BareOutput) mprintf("\n"); }
int main(int argc, char** argv) { Opt2 opt(argc, argv, "rxcpulma:z:qo:", IntRange(1, 999999), "hexdump=x,cat=c,plain=p,unpack=u,list=l,md5=m,recursive=r,quiet=q,prepend=z,append=a,output=o"); const bool hexdump = opt.Has('x', "- produce hexdump"); const bool cat = opt.Has('c', "- do not store keys (file names), just cat uncompressed files"); const bool doNotZip = opt.Has('p', "- do not use compression"); const bool unpack = opt.Has('u', "- unpack archive in current dir"); const bool list = opt.Has('l', "- list files in archive"); const bool listMd5 = opt.Has('m', "- list files in archive with md5"); const bool recursive = opt.Has('r', "- read all files under each directory, recursively"); Quiet = opt.Has('q', "- do not output progress on stderr."); Stroka prepend = opt.Arg('z', "<PREFIX> - prepend string to output", 0); Stroka append = opt.Arg('a', "<SUFFIX> - append string to output", 0); const Stroka outputf = opt.Arg('o', "<FILE> - output to file instead stdout", 0); opt.AutoUsageErr("<file>..."); // "Files or directories to archive." SubstGlobal(append, "\\n", "\n"); SubstGlobal(prepend, "\\n", "\n"); yvector<TRec> recs; for (size_t i = 0; i != opt.Pos.size(); ++i) { Stroka path = opt.Pos[i]; size_t off = 0; #ifdef _win_ if (path[0] > 0 && isalpha(path[0]) && path[1] == ':') off = 2; // skip drive letter ("d:") #endif // _win_ const size_t pos = path.find(':', off); TRec cur; cur.Path = path.substr(0, pos); if (pos != Stroka::npos) cur.Prefix = path.substr(pos + 1); cur.Recursive = recursive; cur.Fix(); recs.push_back(cur); } try { if (listMd5) { for (yvector<TRec>::const_iterator it = recs.begin(); it != recs.end(); ++it) { ListArchiveMd5(it->Path); } } else if (list) { for (yvector<TRec>::const_iterator it = recs.begin(); it != recs.end(); ++it) { ListArchive(it->Path); } } else if (unpack) { for (yvector<TRec>::const_iterator it = recs.begin(); it != recs.end(); ++it) { UnpackArchive(it->Path); } } else { TAutoPtr<TOutputStream> outf(OpenOutput(outputf)); TOutputStream* out = outf.Get(); THolder<TOutputStream> hexout; if (hexdump) { hexout.Reset(new THexOutput(out)); out = hexout.Get(); } outf->Write(~prepend, +prepend); if (cat) { for (yvector<TRec>::const_iterator it = recs.begin(); it != recs.end(); ++it) { it->Recurse(*out); } } else { TArchiveWriter w(out, !doNotZip); for (yvector<TRec>::const_iterator it = recs.begin(); it != recs.end(); ++it) { it->Recurse(w); } w.Finish(); } outf->Write(~append, +append); try { out->Finish(); } catch (...) { } } } catch (...) { Cerr << CurrentExceptionMessage() << Endl; return 1; } return 0; }