internal XmlImportFileEntry(ImportFileEntry fileEntry) { if (fileEntry == null) { throw new ArgumentNullException("fileEntry"); } selected = fileEntry.Selected; status = fileEntry.Status; displayText = fileEntry.DisplayText; uri = fileEntry.Uri; }
private void ProcessDirectory(IFileObject directory, bool includeSubDirs) { IFileObject[] files = directory.findFiles(Selectors.SELECT_CHILDREN); if (files == null) { return; } foreach (IFileObject file in files) { if (this.excludeList.ContainsKey(file.Name.URI)) { continue; } if (file.Type == FileType.FILE) { IFileName name = file.Name; string extension = name.Extension; switch (extension) { case "fb2": ImportFileEntry entry = new ImportFileEntry(chkSelectFoundFiles.Checked, name.BaseName, name.URI); entry.Status = ImportStatus.ReadyToProcess; if (entry.Selected) { this.processLegend.IncrementCounter(ImportStatus.ReadyToProcess); this.grdLegend.RefreshDataSource(); } this.fileEntries.Add(entry); this.excludeList.Add(file.Name.URI, entry); break; case "zip": String url = "zip:" + name.URI + "!/"; //string filename = Path.ChangeExtension(name.BaseName, null); //if(String.Compare(Path.GetExtension(filename), ".fb2", true) == 0) //{ // if (this.excludeList.ContainsKey(url + filename)) // { // continue; // } // entry = new ImportFileEntry(chkSelectFoundFiles.Checked, filename, url + filename); // entry.Status = ImportStatus.ReadyToProcess; // if (entry.Selected) // { // this.processLegend.IncrementCounter(ImportStatus.ReadyToProcess); // this.grdLegend.RefreshDataSource(); // } // this.fileEntries.Add(entry); // this.excludeList.Add(entry.Uri, entry); // break; //} IFileObject zipFile = manager.resolveFile(url); ProcessDirectory(zipFile, true); break; case "7z": IFileObject sevenZipFile = manager.resolveFile("sevenzip:" + name.URI + "!/"); ProcessDirectory(sevenZipFile, true); break; case "rar": IFileObject rarFile = manager.resolveFile("rar:" + name.URI + "!/"); ProcessDirectory(rarFile, true); break; } } else if (file.Type == FileType.FOLDER && includeSubDirs) { ProcessDirectory(file, true); } } }
private void Process(ImportFileEntry entry) { Fb2DocumentEntry documentEntry = null; try { IFileObject fileObject = manager.resolveFile(entry.Uri); documentEntry = new Fb2DocumentEntry(); documentEntry.OriginalFileName = entry.DisplayText; documentEntry.Filename = entry.Uri; documentEntry.FileDate = new DateTime(fileObject.Content.LastModifiedTime); documentEntry.FileSize = fileObject.Content.Size; try { try { processLog.Add(documentEntry); using (Stream stream = fileObject.Content.InputStream) { try { if (stream.CanSeek) { documentEntry.Status = ProcessDocument(documentEntry, stream); } else { using (MemoryStream memoryStream = new MemoryStream((int)documentEntry.FileSize)) { byte[] buffer = bufferPool.Aquire(); try { StreamUtils.Copy(stream, memoryStream, buffer); } finally { bufferPool.Release(buffer); } memoryStream.Seek(0, SeekOrigin.Begin); documentEntry.Status = ProcessDocument(documentEntry, stream); } } } finally { stream.Close(); } } entry.Status = documentEntry.Status; } catch (Exception exp) { Logger.WriteError(exp.Message); Logger.WriteLine(TraceEventType.Verbose, exp); documentEntry.Status = ImportStatus.ParsingError; documentEntry.ErrorText = exp.Message; entry.Status = ImportStatus.ParsingError; this.processLegend.IncrementCounter(ImportStatus.ParsingError); } } finally { manager.closeFileSystem(fileObject.FileSystem); } this.grdResult.RefreshDataSource(); switch (documentEntry.Status) { case ImportStatus.Added: case ImportStatus.FilteredOut: case ImportStatus.Updated: case ImportStatus.Duplicate: entry.Selected = false; this.processLegend.DecrementCounter(ImportStatus.ReadyToProcess); break; } } catch (FileSystemException exp) { Logger.WriteError(exp.Message); Logger.WriteLine(TraceEventType.Verbose, exp); if (documentEntry != null) { documentEntry.Status = ImportStatus.ArchiveError; documentEntry.ErrorText = exp.Message; } entry.Status = ImportStatus.ArchiveError; this.processLegend.IncrementCounter(ImportStatus.ArchiveError); } this.grdSelectedFiles.RefreshDataSource(); this.grdLegend.RefreshDataSource(); Application.DoEvents(); }