/// <summary> /// Recursively add all files and directories to the given tar archive. /// </summary> /// <param name="archive">the archive we are working on</param> /// <param name="directory">the directory we want to add files from</param> /// <param name="rootDirectory">this path is stripped from the filename used in tar file</param> /// <param name="packageType">the package type - used for filtering some files that are not needed for SIP-packages</param> /// <param name="tarArchive">the archive to add files to</param> /// <param name="fileNamePrefix">a prefix to add to all files after removing the root directory.</param> private void AddFilesInDirectory(Archive archive, DirectoryInfo directory, DirectoryInfo rootDirectory, PackageType?packageType, TarArchive tarArchive, string fileNamePrefix = null) { foreach (DirectoryInfo currentDirectory in directory.GetDirectories()) { if ((packageType != null) && (packageType == PackageType.SubmissionInformationPackage) && DirectoriesToSkipForSipPackages.Contains(currentDirectory.Name)) { continue; } CreateEntry(currentDirectory.FullName, rootDirectory, tarArchive, fileNamePrefix, Path.DirectorySeparatorChar.ToString()); AddFilesInDirectory(archive, currentDirectory, rootDirectory, packageType, tarArchive, fileNamePrefix); } foreach (FileInfo file in directory.GetFiles()) { if (file.FullName == archive.GetInformationPackageFileName().FullName) // don't try to add the tar file into the tar file... { continue; } if (FileIsInSkipList(packageType, file)) { continue; } CreateEntry(file.FullName, rootDirectory, tarArchive, fileNamePrefix); } }
private void CreatePackage(PackageType packageType, Archive archive, string targetFileName) { if (targetFileName == null) { targetFileName = archive.GetInformationPackageFileName().FullName; } Stream outStream = File.Create(targetFileName); TarArchive tarArchive = TarArchive.CreateOutputTarArchive(new TarOutputStream(outStream)); AddFilesInDirectory(archive, archive.WorkingDirectory.Root().DirectoryInfo(), packageType, tarArchive); if (archive.WorkingDirectory.HasExternalContentDirectory()) { Log.Debug($"Archive has external content directory, including files from {archive.WorkingDirectory.Content()}"); string filenamePrefix = ArkadeConstants.DirectoryNameContent + Path.DirectorySeparatorChar; AddFilesInDirectory(archive, archive.WorkingDirectory.Content().DirectoryInfo(), null, tarArchive, filenamePrefix); } tarArchive.Close(); }
private string CreatePackage(PackageType packageType, Archive archive, ArchiveMetadata metadata, string outputDirectory) { string packageDirectory = CreatePackageDirectory(archive, outputDirectory); string packageFilePath = Path.Combine(packageDirectory, archive.GetInformationPackageFileName()); Stream outStream = File.Create(packageFilePath); TarArchive tarArchive = TarArchive.CreateOutputTarArchive(new TarOutputStream(outStream)); string packageRootDirectory = archive.Uuid.GetValue() + Path.DirectorySeparatorChar; CreateEntry(packageRootDirectory, false, new DirectoryInfo("none"), tarArchive, string.Empty, string.Empty); AddFilesInDirectory( archive, archive.WorkingDirectory.Root().DirectoryInfo(), packageType, tarArchive, packageRootDirectory ); if (archive.WorkingDirectory.HasExternalContentDirectory()) { Log.Debug($"Archive has external content directory, including files from {archive.WorkingDirectory.Content()}"); string contentDirectory = packageRootDirectory + ArkadeConstants.DirectoryNameContent + Path.DirectorySeparatorChar; AddFilesInDirectory( archive, archive.WorkingDirectory.Content().DirectoryInfo(), null, tarArchive, contentDirectory ); } tarArchive.Close(); new InfoXmlCreator().CreateAndSaveFile(metadata, packageFilePath); HasRun = true; return(packageFilePath); }