private static void CreateDirForFile(string sFilename) { string strTemp = Path.GetDirectoryName(sFilename); if (string.IsNullOrEmpty(strTemp)) { return; } if (Directory.Exists(strTemp)) { return; } while ((strTemp.Length > 0) && !Directory.Exists(strTemp)) { int pos = strTemp.LastIndexOf(Path.DirectorySeparatorChar); if (pos < 0) { pos = 0; } strTemp = strTemp.Substring(0, pos); } while (sFilename.IndexOf(Path.DirectorySeparatorChar, strTemp.Length + 1) > 0) { strTemp = sFilename.Substring(0, sFilename.IndexOf(Path.DirectorySeparatorChar, strTemp.Length + 1)); Directory.CreateDirectory(strTemp); } }
private static void ScanRomRoot(string directory) { _bgw.ReportProgress(0, new bgwText("Scanning Dir : " + directory)); DirectoryInfo di = new DirectoryInfo(directory); FileInfo[] fi = di.GetFiles(); _bgw.ReportProgress(0, new bgwRange2Visible(true)); _bgw.ReportProgress(0, new bgwSetRange2(fi.Count())); for (int j = 0; j < fi.Count(); j++) { if (_bgw.CancellationPending) { return; } FileInfo f = fi[j]; _bgw.ReportProgress(0, new bgwValue2(j)); _bgw.ReportProgress(0, new bgwText2(f.Name)); string ext = Path.GetExtension(f.Name); if (ext.ToLower() == ".gz") { gZip gZipTest = new gZip(); ZipReturn errorcode = gZipTest.ZipFileOpen(f.FullName); if (errorcode != ZipReturn.ZipGood) { _bgw.ReportProgress(0, new bgwShowError(f.FullName, "gz File corrupt")); if (!Directory.Exists("corrupt")) { Directory.CreateDirectory("corrupt"); } File.Move(f.FullName, Path.Combine("corrupt", f.Name)); continue; } RvFile tFile = RvFile.fromGZip(f.FullName, gZipTest.ExtraData, gZipTest.CompressedSize); gZipTest.ZipFileClose(); FindStatus res = fileneededTest(tFile); if (res != FindStatus.FoundFileInArchive) { if (deep) { gZipTest = new gZip(); try { errorcode = gZipTest.ZipFileOpen(f.FullName); if (errorcode == ZipReturn.ZipGood) { FileScan fs = new FileScan(); List <FileScan.FileResults> gRes = fs.Scan(gZipTest, true, true); errorcode = gRes[0].FileStatus; gZipTest.ZipFileClose(); } } catch { gZipTest.ZipFileClose(); _bgw.ReportProgress(0, new bgwShowError(f.FullName, "gz Crashed Compression")); if (!Directory.Exists("corrupt")) { Directory.CreateDirectory("corrupt"); } File.Move(f.FullName, Path.Combine("corrupt", f.Name)); continue; } if (errorcode != ZipReturn.ZipGood) { _bgw.ReportProgress(0, new bgwShowError(f.FullName, "gz File corrupt")); if (!Directory.Exists("corrupt")) { Directory.CreateDirectory("corrupt"); } File.Move(f.FullName, Path.Combine("corrupt", f.Name)); continue; } } tFile.DBWrite(); } } if (_bgw.CancellationPending) { return; } } DirectoryInfo[] childdi = di.GetDirectories(); foreach (DirectoryInfo d in childdi) { if (_bgw.CancellationPending) { return; } ScanRomRoot(d.FullName); } }
public static void ScanFiles(ThreadWorker e) { #if !DEBUG try { #endif _fileErrorAbort = false; _cacheSaveTimer = new Stopwatch(); _cacheSaveTimer.Reset(); if (Settings.rvSettings.CacheSaveTimerEnabled) { _cacheSaveTimer.Start(); } _thWrk = e; if (_thWrk == null) { return; } _thWrk.Report(new bgwText("Clearing DB Status")); RepairStatus.ReportStatusReset(DB.DirRoot); _thWrk.Report(new bgwText("Finding Dir's to Scan")); //Next get a list of all the directories to be scanned List <RvFile> lstDir = new List <RvFile>(); DBHelper.GetSelectedDirListStart(ref lstDir, StartAt); _thWrk.Report(new bgwText("Scanning Dir's")); _thWrk.Report(new bgwSetRange(lstDir.Count)); //Scan the list of directories. for (int i = 0; i < lstDir.Count; i++) { _thWrk.Report(i + 1); _thWrk.Report(new bgwText("Scanning Dir : " + lstDir[i].FullName)); string lDir = lstDir[i].FullName; Console.WriteLine(lDir); if (Directory.Exists(lDir)) { lstDir[i].GotStatus = GotStatus.Got; CheckADir(lstDir[i], true); } else { MarkAsMissing(lstDir[i]); } if (_thWrk.CancellationPending || _fileErrorAbort) { break; } } _thWrk.Report(new bgwText("Updating Cache")); DB.Write(); _thWrk.Report(new bgwText("File Scan Complete")); _thWrk.Finished = true; _thWrk = null; #if !DEBUG } catch (Exception exc) { ReportError.UnhandledExceptionHandler(exc); _thWrk?.Report(new bgwText("Updating Cache")); DB.Write(); _thWrk?.Report(new bgwText("Complete")); if (_thWrk != null) { _thWrk.Finished = true; } _thWrk = null; } #endif }
public static ReturnCode DecompressSource7ZipFile(RvFile zZipFileIn, bool includeGood, out string error) { byte[] buffer = new byte[BufferSize]; RvFile cacheDir = DB.RvFileCache(); string fileNameIn = zZipFileIn.FullName; SevenZ zipFileIn = new SevenZ(); ZipReturn zr1 = zipFileIn.ZipFileOpen(fileNameIn, zZipFileIn.TimeStamp, true); if (zr1 != ZipReturn.ZipGood) { error = "Error opening 7zip file for caching"; return(ReturnCode.RescanNeeded); } RvFile outDir = new RvFile(FileType.Dir) { Name = zZipFileIn.Name + ".cache", Parent = cacheDir, DatStatus = DatStatus.InToSort, GotStatus = GotStatus.Got }; int nameDirIndex = 0; while (cacheDir.ChildNameSearch(outDir, out int index) == 0) { nameDirIndex++; outDir.Name = zZipFileIn.Name + ".cache (" + nameDirIndex + ")"; } cacheDir.ChildAdd(outDir); Directory.CreateDirectory(outDir.FullName); for (int i = 0; i < zipFileIn.LocalFilesCount(); i++) { if (zZipFileIn.Child(i).IsDir) { continue; } RvFile thisFile = null; for (int j = 0; j < zZipFileIn.ChildCount; j++) { if (zZipFileIn.Child(j).ZipFileIndex != i) { continue; } thisFile = zZipFileIn.Child(j); break; } if (thisFile == null) { error = "Error opening 7zip file for caching"; return(ReturnCode.RescanNeeded); } bool extract = true; // first check to see if we have a file version of this compressed file somewhere else. foreach (RvFile f in thisFile.FileGroup.Files) { if (f.FileType == FileType.File && f.GotStatus == GotStatus.Got) { extract = false; } } if (!extract) { continue; } extract = false; if (includeGood) { // if this is the file we are fixing then pull out the correct files. if (thisFile.RepStatus == RepStatus.Correct) { extract = true; } } // next check to see if we need this extracted to fix another file foreach (RvFile f in thisFile.FileGroup.Files) { if (f.RepStatus == RepStatus.CanBeFixed) { extract = true; break; } } if (!extract) { continue; } string cleanedName = thisFile.Name; cleanedName = cleanedName.Replace("/", "-"); cleanedName = cleanedName.Replace("\\", "-"); RvFile outFile = new RvFile(FileType.File) { Name = cleanedName, Size = thisFile.Size, CRC = thisFile.CRC, SHA1 = thisFile.SHA1, MD5 = thisFile.MD5, HeaderFileType = thisFile.HeaderFileType, AltSize = thisFile.AltSize, AltCRC = thisFile.AltCRC, AltSHA1 = thisFile.AltSHA1, AltMD5 = thisFile.AltMD5, FileGroup = thisFile.FileGroup }; outFile.SetStatus(DatStatus.InToSort, GotStatus.Got); outFile.FileStatusSet( FileStatus.HeaderFileTypeFromHeader | FileStatus.SizeFromHeader | FileStatus.SizeVerified | FileStatus.CRCFromHeader | FileStatus.CRCVerified | FileStatus.SHA1FromHeader | FileStatus.SHA1Verified | FileStatus.MD5FromHeader | FileStatus.MD5Verified | FileStatus.AltSizeFromHeader | FileStatus.AltSizeVerified | FileStatus.AltCRCFromHeader | FileStatus.AltCRCVerified | FileStatus.AltSHA1FromHeader | FileStatus.AltSHA1Verified | FileStatus.AltMD5FromHeader | FileStatus.AltMD5Verified , thisFile); outFile.RepStatus = RepStatus.NeededForFix; zipFileIn.ZipFileOpenReadStream(i, out Stream readStream, out ulong unCompressedSize); string filenameOut = Path.Combine(outDir.FullName, outFile.Name); ThreadMD5 tmd5 = null; ThreadSHA1 tsha1 = null; ThreadCRC tcrc32 = new ThreadCRC(); if (Settings.rvSettings.FixLevel != EFixLevel.Level1 && Settings.rvSettings.FixLevel != EFixLevel.TrrntZipLevel1) { tmd5 = new ThreadMD5(); tsha1 = new ThreadSHA1(); } int errorCode = FileStream.OpenFileWrite(filenameOut, out Stream writeStream); ulong sizetogo = unCompressedSize; while (sizetogo > 0) { int sizenow = sizetogo > BufferSize ? BufferSize : (int)sizetogo; try { readStream.Read(buffer, 0, sizenow); } catch (Exception ex) { if (ex is ZlibException || ex is DataErrorException) { ZipReturn zr = zipFileIn.ZipFileCloseReadStream(); if (zr != ZipReturn.ZipGood) { error = "Error Closing " + zr + " Stream :" + zipFileIn.ZipFilename; return(ReturnCode.FileSystemError); } zipFileIn.ZipFileClose(); writeStream.Flush(); writeStream.Close(); if (filenameOut != null) { File.Delete(filenameOut); } thisFile.GotStatus = GotStatus.Corrupt; error = "Unexpected corrupt archive file found:\n" + zZipFileIn.FullName + "\nRun Find Fixes, and Fix to continue fixing correctly."; return(ReturnCode.SourceDataStreamCorrupt); } error = "Error reading Source File " + ex.Message; return(ReturnCode.FileSystemError); } tcrc32.Trigger(buffer, sizenow); tmd5?.Trigger(buffer, sizenow); tsha1?.Trigger(buffer, sizenow); tcrc32.Wait(); tmd5?.Wait(); tsha1?.Wait(); try { writeStream.Write(buffer, 0, sizenow); } catch (Exception e) { error = "Error writing out file. " + Environment.NewLine + e.Message; return(ReturnCode.FileSystemError); } sizetogo = sizetogo - (ulong)sizenow; } writeStream.Flush(); writeStream.Close(); writeStream.Dispose(); tcrc32.Finish(); tmd5?.Finish(); tsha1?.Finish(); byte[] bCRC = tcrc32.Hash; byte[] bMD5 = tmd5?.Hash; byte[] bSHA1 = tsha1?.Hash; tcrc32.Dispose(); tmd5?.Dispose(); tsha1?.Dispose(); FileInfo fi = new FileInfo(filenameOut); outFile.TimeStamp = fi.LastWriteTime; if (bCRC != null && thisFile.CRC != null && !ArrByte.BCompare(bCRC, thisFile.CRC)) { // error in file. } if (bMD5 != null && thisFile.MD5 != null && !ArrByte.BCompare(bMD5, thisFile.MD5)) { // error in file. } if (bSHA1 != null && thisFile.SHA1 != null && !ArrByte.BCompare(bSHA1, thisFile.SHA1)) { // error in file. } thisFile.FileGroup.Files.Add(outFile); outDir.ChildAdd(outFile); } zipFileIn.ZipFileClose(); error = ""; return(ReturnCode.Good); }
private static void Main(string[] args) { try { if (args.Length == 0) { Console.WriteLine(""); Console.WriteLine("trrntzip: missing path"); Console.WriteLine("Usage: trrntzip [OPTIONS] [PATH/ZIP FILES]"); return; } for (int i = 0; i < args.Length; i++) { string arg = args[i]; if (arg.Length < 2) { continue; } if (arg.Substring(0, 1) != "-") { continue; } switch (arg.Substring(1, 1)) { case "?": Console.WriteLine($"TorrentZip.Net v{Assembly.GetExecutingAssembly().GetName().Version.ToString(3)}"); Console.WriteLine(""); Console.WriteLine("Copyright (C) 2020 GordonJ"); Console.WriteLine("Homepage : http://www.romvault.com/trrntzip"); Console.WriteLine(""); Console.WriteLine("Usage: trrntzip [OPTIONS] [PATH/ZIP FILE]"); Console.WriteLine(""); Console.WriteLine("Options:"); Console.WriteLine(""); Console.WriteLine("-? : show this help"); Console.WriteLine("-s : prevent sub-directory recursion"); Console.WriteLine("-f : force re-zip"); Console.WriteLine("-c : Check files only do not repair"); Console.WriteLine("-l : verbose logging"); Console.WriteLine("-v : show version"); Console.WriteLine("-g : pause when finished"); return; case "s": _noRecursion = true; break; case "f": Trrntzip.Program.ForceReZip = true; break; case "c": Trrntzip.Program.CheckOnly = true; break; case "l": Trrntzip.Program.VerboseLogging = true; string logtime = DateTime.Now.ToString("yyyy-MM-dd-HHmmss"); logStream = new StreamWriter($"outlog-{logtime}.txt"); break; case "v": Console.WriteLine("TorrentZip v{0}", Assembly.GetExecutingAssembly().GetName().Version); return; case "g": _guiLaunch = true; break; } } tz = new TorrentZip { StatusCallBack = StatusCallBack, StatusLogCallBack = StatusLogCallBack }; foreach (string tArg in args) { string arg = tArg; if (arg.Length < 2) { continue; } if (arg.Substring(0, 1) == "-") { continue; } if (arg.Length > 2 && arg.Substring(0, 2) == ".\\") { arg = arg.Substring(2); } // first check if arg is a directory if (Directory.Exists(arg)) { ProcessDir(arg); continue; } // now check if arg is a directory/filename with possible wild cards. string dir = Path.GetDirectoryName(arg); if (string.IsNullOrEmpty(dir)) { dir = Environment.CurrentDirectory; } string filename = Path.GetFileName(arg); DirectoryInfo dirInfo = new DirectoryInfo(dir); FileInfo[] fileInfo = dirInfo.GetFiles(filename); foreach (FileInfo file in fileInfo) { string ext = Path.GetExtension(file.FullName).ToLower(); if (!string.IsNullOrEmpty(ext) && ((ext == ".zip") || (ext == ".7z") || (ext == ".iso"))) { tz.Process(new FileInfo(file.FullName)); } } } logStream?.Flush(); logStream?.Close(); logStream?.Dispose(); logStream = null; if (_guiLaunch) { Console.WriteLine("Complete."); Console.ReadLine(); } } catch (Exception e) { Console.WriteLine("{0} Exception caught.", e); logStream?.WriteLine("{0} Exception caught.", e); logStream?.Flush(); logStream?.Close(); logStream?.Dispose(); logStream = null; } }
public bool FullExtract(string filename, string outDir) { MessageCallBack?.Invoke($"Processing file: {filename}"); if (!string.IsNullOrEmpty(outDir)) { MessageCallBack?.Invoke($"Output dir: {outDir}"); } string ext = Path.GetExtension(filename); ICompress z = null; switch (ext.ToLower()) { case ".zip": z = new Zip(); break; case ".7z": z = new SevenZ(); break; } if (z == null) { MessageCallBack?.Invoke($"Unknown file type {ext}"); return(false); } ZipReturn zRet = z.ZipFileOpen(filename); if (zRet != ZipReturn.ZipGood) { MessageCallBack?.Invoke($"Error opening archive {zRet}"); return(false); } ulong buflen = 409600; byte[] buffer = new byte[buflen]; for (int i = 0; i < z.LocalFilesCount(); i++) { LocalFile lf = z.GetLocalFile(i); byte[] cread = null; string filenameOut = lf.Filename; if (lf.IsDirectory) { string outFullDir = Path.Combine(outDir, filenameOut.Substring(0, filenameOut.Length - 1).Replace('/', '\\')); Directory.CreateDirectory(outFullDir); continue; } else { MessageCallBack?.Invoke($"Extracting {filenameOut}"); string fOut = Path.Combine(outDir, filenameOut.Replace('/', '\\')); string dOut = Path.GetDirectoryName(fOut); if (!string.IsNullOrWhiteSpace(dOut) && !Directory.Exists(dOut)) { Directory.CreateDirectory(dOut); } int errorCode = FileStream.OpenFileWrite(fOut, out Stream sWrite); if (errorCode != 0) { MessageCallBack?.Invoke($"Error opening outputfile {fOut}"); } z.ZipFileOpenReadStream(i, out Stream sRead, out _); CRC crc = new(); ulong sizeToGo = lf.UncompressedSize; while (sizeToGo > 0) { ulong sizeNow = sizeToGo > buflen ? buflen : sizeToGo; int sizeRead = sRead.Read(buffer, 0, (int)sizeNow); crc.SlurpBlock(buffer, 0, sizeRead); sWrite.Write(buffer, 0, sizeRead); sizeToGo -= (ulong)sizeRead; } sWrite.Close(); sWrite.Dispose(); cread = crc.Crc32ResultB; } byte[] fread = lf.CRC; if (cread[0] != fread[0] || cread[1] != fread[1] || cread[2] != fread[2] || cread[3] != fread[3]) { MessageCallBack?.Invoke($"CRC error. Expected {fread.ToHex()} found {cread.ToHex()}"); return(false); } } return(true); }