Esempio n. 1
0
        /// <summary>
        /// Unpacks a set of archives into a given directory.
        /// </summary>
        protected ICollection <UnzipResult> UnpackArchives(IEnumerable <string> archivesToUnpack, string unpackDirectory, bool isTargetDirectory)
        {
            var results = new List <UnzipResult>();

            foreach (string archiveToUnpack in archivesToUnpack)
            {
                UnzipResult result = UnpackArchive(archiveToUnpack, unpackDirectory, isTargetDirectory);
                results.Add(result);
            }

            return(results);
        }
Esempio n. 2
0
        /// <summary>
        /// Extract the contents of a zip to a destination directory.
        /// </summary>
        protected UnzipResult ExtractZipContents(ZipFile zipFile, string zipName, string destinationDirectory)
        {
            UnzipResult result = new UnzipResult();

            foreach (ZipEntry zipEntry in zipFile)
            {
                if (zipEntry.IsFile)
                {
                    result.FullUncompressedFileCount++;
                    result.FullUncompressedSize += zipEntry.Size;
                }

                if (QualifiesForExtraction(zipEntry, destinationDirectory))
                {
                    bool isItemAnArchive = IsSupportedArchiveType(zipEntry);
                    if (isItemAnArchive)
                    {
                        Log.InfoFormat("Extracting nested archive '{0}' from '{1}'.. ({2})", Path.GetFileName(zipEntry.Name),
                                       zipName, zipEntry.CompressedSize.ToPrettySize(decimalPlaces: 1));
                    }

                    string extractedItemLocation = ExtractFileFromZip(zipFile, zipEntry, destinationDirectory);
                    result.ExtractedFileCount++;
                    result.ExtractedSize += zipEntry.Size;

                    if (isItemAnArchive && Strategy.UnzipNestedArchives)
                    {
                        string      destinationSubDirectory = Path.Combine(destinationDirectory, Path.GetDirectoryName(zipEntry.Name), Path.GetFileNameWithoutExtension(zipEntry.Name));
                        UnzipResult nestedResult            = ExtractArchive(extractedItemLocation, destinationSubDirectory, deleteOnFinish: true);

                        // Combine tallied metrics with those of nested result.
                        result.FullUncompressedFileCount += nestedResult.FullUncompressedFileCount - 1;
                        result.FullUncompressedSize      += nestedResult.FullUncompressedSize - zipEntry.Size;
                        result.ExtractedFileCount        += nestedResult.ExtractedFileCount - 1;
                        result.ExtractedSize             += nestedResult.ExtractedSize - zipEntry.Size;
                    }
                }
            }

            return(result);
        }
Esempio n. 3
0
        /// <summary>
        /// Extracts a .zip archive and tallies the work done.
        /// </summary>
        protected UnzipResult ExtractZip(Stream zipStream, string zipName, string destinationDirectory)
        {
            ZipFile zipFile = new ZipFile(zipStream)
            {
                IsStreamOwner = true
            };

            try
            {
                UnzipResult result = ExtractZipContents(zipFile, zipName, destinationDirectory);
                result.CompressedSize = zipFile.Cast <ZipEntry>().Sum(zipEntry => zipEntry.CompressedSize);

                Log.InfoFormat("Extracted {0} files from '{1}'. ({2} unpacked)", result.ExtractedFileCount, zipName, result.ExtractedSize.ToPrettySize(decimalPlaces: 1));

                return(result);
            }
            finally
            {
                zipFile.Close();
            }
        }