【问题标题】:Unzip .gz file using c#使用 c# 解压缩 .gz 文件
【发布时间】:2014-07-31 01:28:30
【问题描述】:

如何使用c#解压.gz文件并将文件保存在特定文件夹中?

这是我第一次遇到 .gz 文件。我已经搜索了如何解压缩它但它对我不起作用。它没有将 .gz 文件解压缩到特定文件夹中。我不想使用任何第三方应用程序。

谁能给我一个关于如何解压缩它的示例代码。然后将文件保存在文件夹中。谢谢。

【问题讨论】:

  • 文档包含一个例子:msdn.microsoft.com/en-us/library/…
  • 它解压文件但它不包含文件扩展名
  • 你说的是哪个文件扩展名?示例程序对目录中的文件进行压缩和解压缩,当然你可以适应你需要做的事情。
  • 我的 .gz 包含 excel 文件。但是当我解压缩它时。它只返回没有扩展名的文件。
  • @Kuriyama Mirai 你明白了吗

标签: c# unzip gzip


【解决方案1】:

.Net 有GZipStream

API 中列出的示例...

public static void Decompress(FileInfo fileToDecompress)
    {
        using (FileStream originalFileStream = fileToDecompress.OpenRead())
        {
            string currentFileName = fileToDecompress.FullName;
            string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length);

            using (FileStream decompressedFileStream = File.Create(newFileName))
            {
                using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
                {
                    decompressionStream.CopyTo(decompressedFileStream);
                    Console.WriteLine("Decompressed: {0}", fileToDecompress.Name);
                }
            }
        }
    }

【讨论】:

  • 我之前使用过此代码,但它对我不起作用。我不知道为什么,但它没有解压缩我的 gz 文件。它只删除没有扩展名的 gz 扩展名返回文件。
【解决方案2】:

MSDN 中的以下示例显示了如何使用 GZipStream 类来压缩和解压缩文件目录。

namespace zip
{
    public class Program
    {
        public static void Main()
        {
            string directoryPath = @"c:\users\public\reports";

            DirectoryInfo directorySelected = new DirectoryInfo(directoryPath);

            foreach (FileInfo fileToCompress in directorySelected.GetFiles())
            {
                Compress(fileToCompress);
            }

            foreach (FileInfo fileToDecompress in directorySelected.GetFiles("*.gz"))
            {
                Decompress(fileToDecompress);
            }
        }

        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());
                        }
                    }
                }
            }
        }

        public static void Decompress(FileInfo fileToDecompress)
        {
            using (FileStream originalFileStream = fileToDecompress.OpenRead())
            {
                string currentFileName = fileToDecompress.FullName;
                string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length);

                using (FileStream decompressedFileStream = File.Create(newFileName))
                {
                    using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
                    {
                        decompressionStream.CopyTo(decompressedFileStream);
                        Console.WriteLine("Decompressed: {0}", fileToDecompress.Name);
                    }
                }
            }
        }
    }
}

【讨论】:

  • 我之前使用过此代码,但它对我不起作用。我不知道为什么,但它没有解压缩我的 gz 文件。它只删除没有扩展名的 gz 扩展名返回文件。
  • GZip 只压缩一个文件 - 不知道名称。因此,如果您压缩文件 myReport.xls,您应该将其命名为 myReport.xls.gz。解压缩时,最后一个文件扩展名将被删除,因此您最终会得到原始文件名。这就是它在 Unix/Linux 中使用多年的方式......
  • @KuriyamaMirai 看看设置newFileName的行
  • 我想当你在你的文件名末尾添加 .gz 扩展名时它会起作用你试过了吗
  • 现在我知道了。我会尝试一下。太感谢了。这回答了我的问题。
【解决方案3】:

以下链接显示了 C# 中文件的压缩和解压缩的两个示例。您可以使用此示例。

示例(使用 7-zip):

var tmp = new SevenZipCompressor();
tmp.ScanOnlyWritable = true;
tmp.CompressFilesEncrypted(outputFilePath, password, filePaths);

示例(使用 ZipArchive):

ZipArchive zip = ZipFile.Open(filePath, ZipArchiveMode.Create);
zip.CreateEntryFromFile(file, Path.GetFileName(file), CompressionLevel.Optimal);
zip.Dispose();

更多信息:

http://csharpexamples.com/zip-and-unzip-files-programmatically-in-c/

【讨论】:

  • 这和.gz文件有什么关系?