private void ReplaceArchiveWithExtractedContents(FileSystemItemModel archiveFileSystemItemModel, DirectoryInfo archiveExtractionDirectory) { //if (archiveFileSystemItemModel.ParentFileSystemItem.IsDirectory) //{ // FileSystemItemModel parent = archiveFileSystemItemModel.ParentFileSystemItem; // ObservableCollection<FileSystemItemModel> parentContainigFileSystemElementCollection = parent.ChildFileSystemItems; // int archiveFileIndex = parentContainigFileSystemElementCollection.IndexOf(archiveFileSystemItemModel); // var archiveRepresentationNode = new FileSystemItemModel( // parent.RootFileSystemItemModel, // parent, // archiveExtractionDirectory) {IsArchive = true, DisplayName = archiveFileSystemItemModel.Info.Name.Equals(archiveExtractionDirectory.Name, StringComparison.OrdinalIgnoreCase) ? "" : archiveExtractionDirectory.Name }; // List<FileSystemItemModel> lazySubdirectories = archiveRepresentationNode.InitializeWithLazyTreeStructure(); // archiveRepresentationNode.SortChildren(); // FilterFileSystemTree(archiveRepresentationNode); // Application.Current.Dispatcher.Invoke( // () => // { // parentContainigFileSystemElementCollection.Insert(archiveFileIndex, archiveRepresentationNode); // parentContainigFileSystemElementCollection.Remove(archiveFileSystemItemModel); // archiveFileSystemItemModel.ParentFileSystemItem.ChildFileSystemItems = // parentContainigFileSystemElementCollection; // if (archiveRepresentationNode.IsLazyLoading) // { // ObserveVirtualDirectories(lazySubdirectories); // } // archiveRepresentationNode.IsExpanded = true; // }, // DispatcherPriority.Send); //} }
private void CleanUpExtraction(FileSystemItemModel archiveFileItemModel) { ClearIsExtracting(); lock (this.syncLock) { this.ArchiveExtractorInstanceTable.Remove(archiveFileItemModel); this.ExtractionProgressTable.Remove(archiveFileItemModel.Info); } ClearIsBusy(); }
public async Task <(bool IsSuccessful, DirectoryInfo DestinationDirectory)> ExtractArchive(FileSystemItemModel archiveFileItemModel) { if (archiveFileItemModel.IsDirectory || !archiveFileItemModel.Info.Exists) { return(false, new DirectoryInfo(@"c:\")); } SetIsBusy(); var fileExtractor = new SharpCompressLibArchiveExtractor(); lock (this.syncLock) { if (this.ArchiveExtractorInstanceTable.ContainsKey(archiveFileItemModel)) { ClearIsBusy(); return(false, new DirectoryInfo(@"c:\")); } this.ArchiveExtractorInstanceTable.Add(archiveFileItemModel, fileExtractor); } SetIsExtracting(); var progressReporter = new Progress <ExtractionProgressEventArgs>(ReportExtractionProgress); (bool IsSuccessful, DirectoryInfo DestinationDirectory)extractionResult = await fileExtractor.ExtractZipArchiveAsync(archiveFileItemModel.Info as FileInfo, progressReporter); // Replace archive file with directory representation in explorer after extraction completed if (extractionResult.IsSuccessful) { ReplaceArchiveWithExtractedContents(archiveFileItemModel, extractionResult.DestinationDirectory); } CleanUpExtraction(archiveFileItemModel); return(extractionResult); }