Gzip каталог, который имеет подкаталоги, используя класс GZipStream с C #? - PullRequest
2 голосов
/ 11 мая 2011

На этом сайте MSDN есть пример для сжатия файла. Тогда, как я могу сжать весь каталог с подкаталогами в нем?

Ответы [ 4 ]

2 голосов
/ 11 мая 2011

Поскольку gzip работает только с файлами, я предлагаю вам распаковать ваш каталог tar, а затем скопировать сгенерированный файл tar.

Вы можете использовать tar-cs или SharpZipLib создать свой файл tar.

0 голосов
/ 13 апреля 2019

Вы можете архивировать каталог в чистом .NET 3.0. Использование SharpZipLib может быть нежелательным из-за измененной лицензии GPL.

Для начала вам понадобится ссылка на WindowsBase.dll.

Этот код откроет или создаст zip-файл, создаст каталог внутри и поместит файл в этот каталог. Если вы хотите сжать папку, возможно, содержащую подкаталоги, вы можете перебрать файлы в каталоге и вызвать этот метод для каждого файла. Затем вы можете сначала выполнить поиск в подкаталогах файлов, вызвать метод для каждого из них и указать путь для создания этой иерархии в zip-файле.

public void AddFileToZip(string zipFilename, string fileToAdd, string destDir)
{
    using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate))
    {
        string destFilename = "." + destDir + "\\" + Path.GetFileName(fileToAdd);
        Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
        if (zip.PartExists(uri))
        {
            zip.DeletePart(uri);
        }
        PackagePart part = zip.CreatePart(uri, "", CompressionOption.Normal);

        using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read))
        {
            using (Stream dest = part.GetStream())
            {
                CopyStream(fileStream, dest);
            }
        }
    }
}

destDir может быть пустой строкой, которая поместит файл прямо в zip.

Источники: https://weblogs.asp.net/jongalloway/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib

https://weblogs.asp.net/albertpascual/creating-a-folder-inside-the-zip-file-with-system-io-packaging

0 голосов
/ 11 мая 2011

gzip работает в потоке simgle.Чтобы создать многопотоковый (многофайловый) архив с помощью gzipstream, вам нужно включить свой собственный индекс.По сути, проще всего записать смещения файла в начало выходного потока, а затем, когда вы прочитаете его обратно, вы узнаете, где находятся границы.Этот метод не будет совместим с PKZIP.Чтобы быть совместимым, вы должны прочитать и реализовать формат ZIP ... или использовать что-то вроде SharpZip или Zip.NET

0 голосов
/ 11 мая 2011

Вы не можете!

GZip был создан для файла, а не для каталогов:)

...