首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在不使用第三方API的情况下在C#中压缩文件?

如何在不使用第三方API的情况下在C#中压缩文件?
EN

Stack Overflow用户
提问于 2009-06-03 00:41:27
回答 5查看 194.6K关注 0票数 184

我很确定这不是复制品,请稍等片刻。

如何在不使用任何第三方库的情况下以编程方式(C#)压缩文件(在Windows中)?我需要一个本地的windows调用或类似的东西;我真的不喜欢启动一个进程的想法,但如果真的有必要的话,我会这样做的。PInovke调用会更好。

如果做不到这一点,让我告诉您我真正想要实现的目标:我需要能够让用户在单个请求中下载一组文档。对于如何实现这一点有什么想法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-02 16:46:50

您使用的是.NET 3.5吗?您可以使用ZipPackage类和相关类。它不仅仅是压缩一个文件列表,因为它想为你添加的每个文件提供一个MIME类型。它可能会做你想做的事。

我目前正在使用这些类来解决类似的问题,将几个相关的文件归档到一个单独的文件中以供下载。我们使用文件扩展名将下载文件与我们的桌面应用程序相关联。我们遇到的一个小问题是,不可能只使用像7-zip这样的第三方工具来创建zip文件,因为客户端代码无法打开它-- ZipPackage添加了一个描述每个组件文件内容类型的隐藏文件,如果缺少内容类型文件,则无法打开zip文件。

票数 87
EN

Stack Overflow用户

发布于 2015-04-21 09:59:57

代码语言:javascript
复制
    private static string CompressFile(string sourceFileName)
    {
        using (ZipArchive archive = ZipFile.Open(Path.ChangeExtension(sourceFileName, ".zip"), ZipArchiveMode.Create))
        {
            archive.CreateEntryFromFile(sourceFileName, Path.GetFileName(sourceFileName));
        }
        return Path.ChangeExtension(sourceFileName, ".zip");
    }
票数 12
EN

Stack Overflow用户

发布于 2014-10-08 19:42:09

根据Simon McKenzie的答案to this question,我建议使用如下两种方法:

代码语言:javascript
复制
    public static void ZipFolder(string sourceFolder, string zipFile)
    {
        if (!System.IO.Directory.Exists(sourceFolder))
            throw new ArgumentException("sourceDirectory");

        byte[] zipHeader = new byte[] { 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

        using (System.IO.FileStream fs = System.IO.File.Create(zipFile))
        {
            fs.Write(zipHeader, 0, zipHeader.Length);
        }

        dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
        dynamic source = shellApplication.NameSpace(sourceFolder);
        dynamic destination = shellApplication.NameSpace(zipFile);

        destination.CopyHere(source.Items(), 20);
    }

    public static void UnzipFile(string zipFile, string targetFolder)
    {
        if (!System.IO.Directory.Exists(targetFolder))
            System.IO.Directory.CreateDirectory(targetFolder);

        dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
        dynamic compressedFolderContents = shellApplication.NameSpace(zipFile).Items;
        dynamic destinationFolder = shellApplication.NameSpace(targetFolder);

        destinationFolder.CopyHere(compressedFolderContents);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/940582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档