如何使用GZipStream压缩/解压缩目录?

时间:2012-09-30 10:24:08

标签: c# .net

我想要压缩/解压缩目录而不需要任何dll。

我使用此代码使用GzipStream压缩文件。

 public static void Compress(FileInfo fileToCompress)
    {
        using (FileStream originalFileStream = fileToCompress.OpenRead())
        {
            if ((File.GetAttributes(fileToCompress.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fileToCompress.Extension != ".gz")
            {
                using (FileStream compressedFileStream = File.Create(fileToCompress.FullName + ".gz"))
                {
                    using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress))
                    {
                        originalFileStream.CopyTo(compressionStream);
                        Console.WriteLine("Compressed {0} from {1} to {2} bytes.",
                            fileToCompress.Name, fileToCompress.Length.ToString(), compressedFileStream.Length.ToString());
                    }
                }
            }
        }
    }

我将此link用于压缩目录。但不适合我:(

2 个答案:

答案 0 :(得分:0)

据我所知,您无法将整个目录压缩为单个gz文件。你最终得到了多个gz文件。

答案 1 :(得分:0)

您可以将目录打包为.Tar文件,然后在tar文件上使用gZip。 这将需要使用诸如SharpZipLib之类的库。您可以从“管理NuGet软件包”菜单安装该库。

DirectoryInfo directoryOfFilesToBeTarred = new DirectoryInfo(@"c:\tar\start");
FileInfo[] filesInDirectory = directoryOfFilesToBeTarred.GetFiles();
String tarArchiveName = @"c:\tar\mytararchive.tar.gz";
using (Stream targetStream = new GZipOutputStream(File.Create(tarArchiveName)))
{
    using (TarArchive tarArchive = TarArchive.CreateOutputTarArchive(targetStream, TarBuffer.DefaultBlockFactor))
    {
        foreach (FileInfo fileToBeTarred in filesInDirectory)
        {
            TarEntry entry = TarEntry.CreateEntryFromFile(fileToBeTarred.FullName);
            tarArchive.WriteEntry(entry, true);
        }
    }
}

来源: https://dotnetcodr.com/2015/02/04/packing-and-unpacking-files-using-tar-archives-in-net/

OR

您可以在纯.NET 3.0中压缩目录。由于修改了GPL许可证,可能不希望使用SharpZipLib。

首先,您需要对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