Пример #1
0
        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;
        }
Пример #2
0
        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));
            }
        }
Пример #3
0
        /// <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.
        }
Пример #4
0
        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));
                    }
                }
            }
        }
Пример #5
0
        /// <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.
        }