public LoadedFilesData LoadComicBook(string[] files) { LoadedFilesData returnValue = new LoadedFilesData { ComicBook = new ComicBook() }; Array.Sort(files); if (files.Any(file => !System.IO.File.Exists(file))) { returnValue.Error = "One or more archives were not found"; return(returnValue); } NukeThread(); // kill any unfinished async load var comicFile = new ComicFile { Location = files[0] }; returnValue.ComicBook.Add(comicFile); int initialFilesToRead; try { using (SevenZipExtractor extractor = new SevenZipExtractor(files[0])) { // "bye bye love letter" comic has a folder whose name ends in .PNG, and the extractor thinks it is an image List <string> tempFileNames = new List <string>(); foreach (var archiveFileInfo in extractor.ArchiveFileData) { if (!archiveFileInfo.IsDirectory) { tempFileNames.Add(archiveFileInfo.FileName); } } _fileNames = tempFileNames.ToArray(); if (_fileNames.Length < 1) // Nothing to show! { returnValue.Error = "Archive has no files."; return(returnValue); } ArchiveLoader.NumericalSort(_fileNames); // TODO need to check validity and keep going if necessary. May result in loading everything synchronous... // The file count may be out-of-sync between the extractor and _filenames, due to skipped folders above // Load the first 5 files (if possible) before returning to GUI initialFilesToRead = Math.Min(5, _fileNames.Count()); // extractor.FilesCount); for (int j = 0; j < initialFilesToRead; j++) { ExtractFile(extractor, j, comicFile, _fileNames); } } } catch (SevenZipArchiveException) { returnValue.Error = "Extractor failed to handle the archive."; return(returnValue); } // Load remaining files in the background _t1 = new Thread(() => { using (SevenZipExtractor extractor2 = new SevenZipExtractor(files[0])) // need 2d extractor for thread: see comment at top of file { for (int i = initialFilesToRead; i < _fileNames.Length; i++) { ExtractFile(extractor2, i, comicFile, _fileNames); } } }); _t1.Start(); return(returnValue); }
private void ExtractFile(SevenZipExtractor extractor, int i, ComicFile comicFile, string [] activeFileNames) { // KBR 04/01/2016 Attempt to deal with archives-of-archives. Alas, this could go into infinite recursive mode if (Utils.ValidateArchiveFileExtension(activeFileNames[i])) { string tempPath = Path.GetTempFileName(); using (FileStream fs = new FileStream(tempPath, FileMode.Create)) { extractor.ExtractFile(activeFileNames[i], fs); } using (SevenZipExtractor extractor3 = new SevenZipExtractor(tempPath)) { List <string> tempFileNames = new List <string>(); foreach (var archiveFileInfo in extractor3.ArchiveFileData) { if (!archiveFileInfo.IsDirectory) { tempFileNames.Add(archiveFileInfo.FileName); } } _fileNames2 = tempFileNames.ToArray(); if (_fileNames2.Length < 1) // Nothing to show! { return; } ArchiveLoader.NumericalSort(_fileNames2); for (int j = 0; j < _fileNames2.Length; j++) { ExtractFile(extractor3, j, comicFile, _fileNames2); } } } //if it is an image add it to array list if (Utils.ValidateImageFileExtension(activeFileNames[i])) { using (MemoryStream ms = new MemoryStream()) { try { extractor.ExtractFile(activeFileNames[i], ms); ms.Position = 0; comicFile.Add(ms.ToArray()); } catch { // Effect of exception will be to NOT add the image to the comic } } } //if it is a txt file set it as InfoTxt if (Utils.ValidateTextFileExtension(activeFileNames[i])) { using (var ms = new MemoryStream()) { extractor.ExtractFile(activeFileNames[i], ms); ms.Position = 0; using (var sr = new StreamReader(ms)) { try { comicFile.InfoText = sr.ReadToEnd(); } catch { } } } } }