#include "hzip.h" #include "TFile.h" #include "TSystem.h" #include "TString.h" #include "TList.h" #include "TObjString.h" #include "TObjArray.h" #include #include #include #include #include using namespace std; #include int main(int argc, char **argv) { TString zipname = "unset"; TString membername= "unset"; TString filter = "unset"; TString filelist = "unset"; TString help = "usage: hzip -o zipfile [-i filefilter] [-f filelist] [-u outputdir] [-msth] \n" " \t -f input ascii filelist (1 file per line) \n" " \t -h help \n" " \t -i input filefilter (like \"be*.root\") \n" " \t -l list file in zip files \n" " \t -m maxsize of file [bytes] (default = 2 Gbyte, will be splitted if larger) \n" " \t -o outputzip file name (required) \n" " \t -s save mode. do not overide existing zip files (default is overwrite) \n" " \t -t test. show what would be done \n" " \t -u dir unzip zip files to dir \n" " \t -w print in which file membername is contained\n" " \t examples: \n" " \t test zip root files : hzip -t -o test.zip -i \"/mydir/be*.root\" \n" " \t zip root files : hzip -o test.zip -i \"/mydir/be*.root\" \n" " \t zip root files from list : hzip -o test.zip -f filelist \n" " \t unzip root files to dir : hzip -i \"test_*.zip\" -u /mydir \n" " \t list files in zip files : hzip -i \"test_*.zip\" -l \n"; Long64_t maxsize = 2000000000; // 2GB if(argc < 2) { fprintf (stderr, "Error: Requiring at least output zip file name!\n"); fprintf (stdout,"%s",help.Data()); return 1; } else{ Int_t c; opterr = 0; Int_t input = 0; Bool_t test = kFALSE; Bool_t save = kFALSE; Bool_t listZip = kFALSE; Bool_t unZip = kFALSE; Bool_t find = kFALSE; TString unZipDir ="unset"; Long64_t tmp=0; //--------------------------------------------------------------- // get options from command line while ((c = getopt (argc, argv, ":i:f:o:m:u:w:tslh")) != -1){ // ':' = required argument, '::' = optional argument switch (c) { case 'h': fprintf (stdout,"%s",help.Data()); return 0; break; case 'i': filter = optarg; break; case 'f': filelist = optarg; break; case 'o': zipname = optarg; break; case 'm': tmp = atol(optarg); if(tmp < maxsize) maxsize = tmp; break; case 't': test = kTRUE; break; case 'l': listZip = kTRUE; break; case 'u': unZip = kTRUE; unZipDir = optarg; break; case 'w': membername = optarg; find = kTRUE; break; case 's': save = kTRUE; break; case ':': // option i,o,l without argument fprintf (stderr, "Option -%c requires an argument.\n", optopt); return 1; break; case '?': fprintf(stderr,"Unrecognized option: -%c\n", optopt); return 1; break; default: fprintf (stderr, "Unknown option `-%c'.\n", optopt); fprintf (stdout,"%s",help.Data()); return 1; } } //--------------------------------------------------------------- //--------------------------------------------------------------- // do some checking on input parameters if(zipname == "unset" && !listZip && !unZip && !find) { fprintf (stderr, "Output file name is required!\n"); fprintf (stdout,"%s",help.Data()); return 1; } if(filelist != "unset" && filter != "unset") { fprintf (stderr, "File selection has to be \'-l filelist\' or \'-i filefilter\'!\n"); fprintf (stdout,"%s",help.Data()); return 1; } if(filelist == "unset" && filter == "unset") { fprintf (stderr, "File selection has to be \'-l filelist\' or \'-i filefilter\'!\n"); fprintf (stdout,"%s",help.Data()); return 1; } if(filelist != "unset" ){ if(gSystem->AccessPathName(filelist.Data())){ fprintf (stderr, "List File '%s' does not exist!\n",filelist.Data() ); fprintf (stdout,"%s",help.Data()); return 1; } } //--------------------------------------------------------------- //--------------------------------------------------------------- // prepare file lists TObjArray* files = 0; cout<<" output file : "<GetEntries(); Long64_t sumSize = 0; Long64_t totalSize = 0; zipname.ReplaceAll(".zip",""); TString zipName = zipname; //--------------------------------------------------------------- if(listZip){ for(Int_t j=0;jAt(j)))->GetString(); HZip::list(fna); } if(files) delete files; return 0; } if(unZip){ for(Int_t j=0;jAt(j)))->GetString(); if(!test) HZip::unzip(fna,unZipDir); else { cout<At(j)))->GetString(); Bool_t found = HZip::isInside(fna, membername , kFALSE); if(found) cout<<"File : "<Unlink(zipName.Data()); } } //--------------------------------------------------------------- TString fna = ((TObjString*)(files->At(j)))->GetString(); gSystem->GetPathInfo(fna.Data(), fileinfo); totalSize += fileinfo.fSize; //--------------------------------------------------------------- // add file to zip , change file if needed if(sumSize+fileinfo.fSize maxsize){ fprintf (stderr, "File = '%s' is larger than maximum zipfile size !\n",fna.Data() ); if(!test) { if(files) delete files; return 1; } } if(!test) HZip::addFile(zipName,fna); } else { // new file fileNum++; zipName = Form("%s_%03i.zip",zipname.Data(),fileNum); if(save && HZip::exists(zipName,kTRUE,kTRUE)){ // silent check fprintf (stderr, "zipFile = '%s' exists already !\n",zipName.Data() ); if(!test) { if(files) delete files; return 1; } } if(!save && HZip::exists(zipName,kTRUE,kTRUE)){ gSystem->Unlink(zipName.Data()); } sumSize=fileinfo.fSize; cout< maxsize){ fprintf (stderr, "File = '%s' is larger than maximum zipfile size !\n",fna.Data() ); if(!test) { if(files) delete files; return 1; } } if(!test) HZip::addFile(zipName,fna); } //--------------------------------------------------------------- } //--------------------------------------------------------------- if(files) delete files; cout<