private int DoAction(IEnumerable <IFileArchivedBase> filesIn, Action action) { if (filesIn == null) { return(0); } var files = filesIn.ToList(); files.ForEach(f => f.Processed = false); int nbFilesProcessed = 0; foreach (var plGroupedFiles in files.GroupBy(f => f.ArchivePath)) { if (action != Action.Archive && !File.Exists(plGroupedFiles.Key)) { continue; } try { if (action == Action.Extract) { // create all necessary extraction folders foreach (var extractDirGroupedFiles in plGroupedFiles.GroupBy(f => Path.GetDirectoryName(((IFileInArchiveToExtract)f).ExtractionPath))) { if (!Directory.Exists(extractDirGroupedFiles.Key) && !string.IsNullOrWhiteSpace(extractDirGroupedFiles.Key)) { Directory.CreateDirectory(extractDirGroupedFiles.Key); } } } using (var proLibrary = new ProLibrary(plGroupedFiles.Key, _cancelToken)) { if (_prolibVersion != ProlibVersion.Default) { proLibrary.Version = _version; } proLibrary.CodePageName = _codePage; proLibrary.OnProgress += OnProgressionEvent; try { foreach (var file in plGroupedFiles) { var fileRelativePath = file.PathInArchive; switch (action) { case Action.Archive: var fileToArchive = (IFileToArchive)file; if (File.Exists(fileToArchive.SourcePath)) { proLibrary.AddExternalFile(fileToArchive.SourcePath, fileRelativePath); nbFilesProcessed++; file.Processed = true; } break; case Action.Extract: if (proLibrary.ExtractToFile(fileRelativePath, ((IFileInArchiveToExtract)file).ExtractionPath)) { nbFilesProcessed++; file.Processed = true; } break; case Action.Delete: if (proLibrary.DeleteFile(fileRelativePath)) { nbFilesProcessed++; file.Processed = true; } break; case Action.Move: if (proLibrary.MoveFile(fileRelativePath, ((IFileInArchiveToMove)file).NewRelativePathInArchive)) { nbFilesProcessed++; file.Processed = true; } break; default: throw new ArgumentOutOfRangeException(nameof(action), action, null); } } if (action != Action.Extract) { proLibrary.Save(); } } finally { proLibrary.OnProgress -= OnProgressionEvent; } } } catch (OperationCanceledException) { throw; } catch (Exception e) { throw new ArchiverException($"Failed to move files from {plGroupedFiles.Key}.", e); } } return(nbFilesProcessed); }
public void ReadAllKindsOfLib() { CreateProlibResources(); var list = GetProlibResources(); foreach (var prolibResource in list) { using (var prolib = new ProLibrary(Path.Combine(TestFolder, prolibResource.FileName), null)) { Assert.AreEqual(prolibResource.ContainedFiles, string.Join(",", prolib.Files.Select(f => f.RelativePath)), $"Wrong file listing for {prolibResource.FileName}."); foreach (var libraryFileEntry in prolib.Files) { if (!File.Exists(Path.Combine(TestFolder, libraryFileEntry.RelativePath))) { prolib.ExtractToFile(libraryFileEntry.RelativePath, Path.Combine(TestFolder, libraryFileEntry.RelativePath)); } } } } Assert.IsTrue(File.ReadAllBytes(Path.Combine(TestFolder, "file")).SequenceEqual(new byte[] { 0xAA }), "file incorrect."); Assert.IsTrue(File.ReadAllBytes(Path.Combine(TestFolder, "file2")).SequenceEqual(new byte[] { 0xAA, 0xAA }), "file2 incorrect."); Assert.IsTrue(File.ReadAllBytes(Path.Combine(TestFolder, "file.r")).SequenceEqual(GetBytesFromResource("file.r")), "file.r incorrect."); foreach (var prolibResource in list.Where(f => f.IsCompressed)) { File.Copy(Path.Combine(TestFolder, prolibResource.FileName), Path.Combine(TestFolder, $"{prolibResource.FileName}_copy.pl")); using (var prolib = new ProLibrary(Path.Combine(TestFolder, $"{prolibResource.FileName}_copy.pl"), null)) { prolib.Save(); var data = new byte[new FileInfo(Path.Combine(TestFolder, prolibResource.FileName)).Length]; File.ReadAllBytes(Path.Combine(TestFolder, $"{prolibResource.FileName}_copy.pl")).CopyTo(data, 0); Assert.IsTrue(data.SequenceEqual(File.ReadAllBytes(Path.Combine(TestFolder, prolibResource.FileName))), $"file not recreated the same way : {prolibResource.FileName}."); } } if (!TestHelper.GetDlcPath(out string dlcPath) || UoeUtilities.GetProVersionFromDlc(dlcPath).Major != 11) { return; } OeProlibArchiver oeArchiver; try { oeArchiver = new OeProlibArchiver(dlcPath, Encoding.Default); } catch (ArchiverException e) { Console.WriteLine($"Cancelling test, prolib not found! : {e.Message}"); return; } File.WriteAllBytes(Path.Combine(TestFolder, "file3"), new byte[] { 0xAA, 0xAA, 0xAA }); File.WriteAllBytes(Path.Combine(TestFolder, "file4"), new byte[] { 0xAA, 0xAA, 0xAA, 0xAA }); foreach (var prolibResource in list.Where(f => f.IsCompressed && f.Version == ProLibraryVersion.V11Standard)) { var path = Path.Combine(TestFolder, $"{prolibResource.FileName}_copy.pl"); Assert.AreEqual(string.Join(",", prolibResource.ContainedFiles.Split(',').OrderBy(s => s)), string.Join(",", oeArchiver.ListFiles(path).Select(f => f.PathInArchive).OrderBy(s => s)), $"Wrong file listing 2 for {prolibResource.FileName}."); oeArchiver.ArchiveFileSet(new List <IFileToArchive> { new FileInArchive { SourcePath = Path.Combine(TestFolder, "file3"), PathInArchive = "sub/file3", ArchivePath = path } }); oeArchiver.ArchiveFileSet(new List <IFileToArchive> { new FileInArchive { SourcePath = Path.Combine(TestFolder, "file4"), PathInArchive = "sub/file4", ArchivePath = path } }); var fileCount = (string.IsNullOrEmpty(prolibResource.ContainedFiles) ? 0 : prolibResource.ContainedFiles.Split(',').Length) + 2; using (var prolib = new ProLibrary(path, null)) { Assert.AreEqual(fileCount, prolib.Files.Count, $"Bad count for {prolibResource.FileName}."); prolib.Save(); } Assert.AreEqual(fileCount, oeArchiver.ListFiles(path).Count()); } }