Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 982|回复: 0

C#使用SharpZipLib创建压缩文件,并指定压缩文件夹路径(解决SharpZipLib压缩长路径显示问题)

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-8-28 12:11:23 | 显示全部楼层 |阅读模式

    在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比如,压缩当前程序目录下的某个文件夹(D:\cx\code\program\bin\debug\files),则生成压缩包后,打开需要访问到cx\code\program\bin\debug\files才可以看到内容。通过实践,变相实现了自定义压缩包目录名称和目录深度的功能。代码及说明如下。

    一、要压缩的文件夹及文件路径分布如下:

    文件夹一:D:\cx\code\program\bin\debug\files\Upload1

    文件夹二:D:\cx\code\program\bin\debug\files\Upload2

    文件夹三:D:\cx\code\program\bin\debug\images\00001

    二、需要生成的压缩包目录格式为:

    压缩包文件

           Upload1

                 file1……fileN

           Upload2

                file1……fileN

           00001

                file1……fileN

    三、主要实现代码

    通过FastZip来添加一次要压缩的文件夹及内容,通过ZipFile来遍历添加不在FastZip一次添加的路径的内容并指定压缩包中的路径。

    1、FastZip一次添加Upload1和Upload2目录(它俩都属于files下级平级目录)

    var fastZip = new FastZip
    {
        Password = "ZipPassword",
        CreateEmptyDirectories = true
    };
    //注意路径最后不要带\ filepath为压缩包路径(如 d:\1.zip) 这里第三个参数为true代表遍历当前目录下的所有目录,第四个参数为过滤文件类型
    fastZip.CreateZip(filePath, @"D:\cx\code\program\bin\debug\files", true, "json");
    

    2、通过ZipFile访问步骤1生成的压缩包文件,并更新文件到指定的压缩包内的路径

    using (var zipFile = new ZipFile(filePath))
    {
        zipFile.BeginUpdate();
        var picList = FilesHelper.FileSearchAsync(dirPicPath, "*.*", SearchOption.AllDirectories,
            x => x.Length > 10);
        foreach (var s in picList)
        {
    //指定新添加的文件在压缩包内的目录路径
            zipFile.Add(s, $@"00001\{new FileInfo(s).Name}");
        }
        zipFile.CommitUpdate();
    }
    

    这样就生成了指定压缩包内路径的压缩包文件。

    附上过滤指定文件夹下指定文件类型的文件代码,上面的检索文件夹可以await

    /// <summary>
    /// 检索指定目录下的文件
    /// </summary>
    /// <param name="directoryPath">检索目录路径</param>
    /// <param name="searchFilter">检索文件类型(如*.mp4)</param>
    /// <param name="option">检索选项</param>
    /// <param name="func">文件过滤器(比如只需要.mp4的文件)</param>
    /// <returns></returns>
    public static async Task<string[]> FileSearchAsync(string directoryPath, string searchFilter, SearchOption option, Func<string, bool> func)
    {
        var files = Task.Run(() => Directory.GetFiles(directoryPath, searchFilter, option).Where(func).ToArray());
        var s = await files;
        return s;
    }
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-3 17:26 , Processed in 0.092005 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表