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);
        }
示例#2
0
        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());
            }
        }