public void Execute() { var payloadCount = this.Payloads.Count(); // The number of embedded payloads if (!String.IsNullOrEmpty(this.ManifestFile)) { ++payloadCount; } var cabinetPath = Path.GetFullPath(this.OutputPath); var files = new List <CabinetCompressFile>(); // If a manifest was provided always add it as "payload 0" to the container. if (!String.IsNullOrEmpty(this.ManifestFile)) { files.Add(new CabinetCompressFile(this.ManifestFile, "0")); } files.AddRange(this.Payloads.Select(p => new CabinetCompressFile(p.SourceFile.Path, p.EmbeddedId))); var cab = new Cabinet(cabinetPath); cab.Compress(files, this.CompressionLevel ?? Data.CompressionLevel.Mszip); // Now that the container is created, set the outputs of the command. var fileInfo = new FileInfo(cabinetPath); this.Hash = BundleHashAlgorithm.Hash(fileInfo); this.Size = fileInfo.Length; }
public void CanCreateSingleFileCabinet() { using (var fs = new DisposableFileSystem()) { var intermediateFolder = fs.GetFolder(true); var cabPath = Path.Combine(intermediateFolder, "testout.cab"); var files = new[] { new CabinetCompressFile(TestData.Get(@"TestData\test.txt"), "test.txt") }; var cabinet = new Cabinet(cabPath); cabinet.Compress(files, CabinetCompressionLevel.Low); Assert.True(File.Exists(cabPath)); } }
/// <summary> /// Creates a cabinet using the wixcab.dll interop layer. /// </summary> /// <param name="cabinetWorkItem">CabinetWorkItem containing information about the cabinet to create.</param> private void CreateCabinet(CabinetWorkItem cabinetWorkItem) { this.Messaging.Write(VerboseMessages.CreateCabinet(cabinetWorkItem.CabinetFile)); int maxCabinetSize = 0; // The value of 0 corresponds to default of 2GB which means no cabinet splitting ulong maxPreCompressedSizeInBytes = 0; if (this.MaximumCabinetSizeForLargeFileSplitting != 0) { // User Specified Max Cab Size for File Splitting, So Check if this cabinet has a single file larger than MaximumUncompressedFileSize // If a file is larger than MaximumUncompressedFileSize, then the cabinet containing it will have only this file if (1 == cabinetWorkItem.FileFacades.Count()) { // Cabinet has Single File, Check if this is Large File than needs Splitting into Multiple cabs // Get the Value for Max Uncompressed Media Size maxPreCompressedSizeInBytes = (ulong)MaximumUncompressedMediaSize * 1024 * 1024; foreach (FileFacade facade in cabinetWorkItem.FileFacades) // No other easy way than looping to get the only row { if ((ulong)facade.File.FileSize >= maxPreCompressedSizeInBytes) { // If file is larger than MaximumUncompressedFileSize set Maximum Cabinet Size for Cabinet Splitting maxCabinetSize = this.MaximumCabinetSizeForLargeFileSplitting; } } } } // create the cabinet file var cabinetPath = Path.GetFullPath(cabinetWorkItem.CabinetFile); string cabinetFileName = Path.GetFileName(cabinetWorkItem.CabinetFile); string cabinetDirectory = Path.GetDirectoryName(cabinetWorkItem.CabinetFile); var files = cabinetWorkItem.FileFacades .Select(facade => facade.Hash == null ? new CabinetCompressFile(facade.WixFile.Source.Path, facade.File.File) : new CabinetCompressFile(facade.WixFile.Source.Path, facade.File.File, facade.Hash.HashPart1, facade.Hash.HashPart2, facade.Hash.HashPart3, facade.Hash.HashPart4)) .ToList(); var cabinetCompressionLevel = (CabinetCompressionLevel)cabinetWorkItem.CompressionLevel; var cab = new Cabinet(cabinetPath); cab.Compress(files, cabinetCompressionLevel, maxCabinetSize, cabinetWorkItem.MaxThreshold); // TODO: Handle newCabNamesCallBackAddress from compression. }
public void IntegrationTest() { using (var fs = new DisposableFileSystem()) { var intermediateFolder = fs.GetFolder(true); var cabinetPath = Path.Combine(intermediateFolder, "testout.cab"); var extractFolder = fs.GetFolder(true); // Compress. { var files = new[] { new CabinetCompressFile(TestData.Get(@"TestData\test.txt"), "test1.txt"), new CabinetCompressFile(TestData.Get(@"TestData\test.txt"), "test2.txt"), }; var cabinet = new Cabinet(cabinetPath); cabinet.Compress(files, CompressionLevel.Low); } // Extract. { var cabinet = new Cabinet(cabinetPath); var reportedFiles = cabinet.Extract(extractFolder); Assert.Equal(2, reportedFiles.Count()); } // Enumerate to compare cabinet to extracted files. { var cabinet = new Cabinet(cabinetPath); var enumerated = cabinet.Enumerate().OrderBy(f => f.FileId).ToArray(); var files = Directory.EnumerateFiles(extractFolder).OrderBy(f => f).ToArray(); for (var i = 0; i < enumerated.Length; ++i) { var cabFileInfo = enumerated[i]; var fileInfo = new FileInfo(files[i]); Assert.Equal(cabFileInfo.FileId, fileInfo.Name); Assert.Equal(cabFileInfo.Size, fileInfo.Length); Assert.True(cabFileInfo.SameAsDateTime(fileInfo.CreationTime)); } } } }
/// <summary> /// Creates a cabinet using the wixcab.dll interop layer. /// </summary> /// <param name="cabinetWorkItem">CabinetWorkItem containing information about the cabinet to create.</param> private void CreateCabinet(CabinetWorkItem cabinetWorkItem) { this.Messaging.Write(VerboseMessages.CreateCabinet(cabinetWorkItem.CabinetFile)); var maxCabinetSize = 0; // The value of 0 corresponds to default of 2GB which means no cabinet splitting ulong maxPreCompressedSizeInBytes = 0; if (this.MaximumCabinetSizeForLargeFileSplitting != 0) { // User Specified Max Cab Size for File Splitting, So Check if this cabinet has a single file larger than MaximumUncompressedFileSize // If a file is larger than MaximumUncompressedFileSize, then the cabinet containing it will have only this file if (1 == cabinetWorkItem.FileFacades.Count()) { // Cabinet has Single File, Check if this is Large File than needs Splitting into Multiple cabs // Get the Value for Max Uncompressed Media Size maxPreCompressedSizeInBytes = (ulong)this.MaximumUncompressedMediaSize * 1024 * 1024; var facade = cabinetWorkItem.FileFacades.First(); // If the file is larger than MaximumUncompressedFileSize set Maximum Cabinet Size for Cabinet Splitting if ((ulong)facade.FileSize >= maxPreCompressedSizeInBytes) { maxCabinetSize = this.MaximumCabinetSizeForLargeFileSplitting; } } } // create the cabinet file var cabinetPath = Path.GetFullPath(cabinetWorkItem.CabinetFile); var files = cabinetWorkItem.FileFacades .OrderBy(f => f.Sequence) .Select(facade => facade.Hash == null ? new CabinetCompressFile(facade.SourcePath, facade.Id + cabinetWorkItem.ModularizationSuffix) : new CabinetCompressFile(facade.SourcePath, facade.Id + cabinetWorkItem.ModularizationSuffix, facade.Hash.HashPart1, facade.Hash.HashPart2, facade.Hash.HashPart3, facade.Hash.HashPart4)) .ToList(); var cab = new Cabinet(cabinetPath); cab.Compress(files, cabinetWorkItem.CompressionLevel, maxCabinetSize, cabinetWorkItem.MaxThreshold); // TODO: Handle newCabNamesCallBackAddress from compression. }