Delphi 的TZipFile压缩文件自定义(去掉盘符)

news2024/11/17 17:27:04

关于Delphi中的TZipFile压缩文件,非常方便,该类位于System.Zip单元中,压缩一个目录只需要一条命令TZipFile.ZipDirectoryContents就可以,但是这也有个不方便,就是不能动态增加文件和目录。如果想自定义增加文件或者目录,而且正常显示所增加的目录标志,就需要使用TZipFile.add函数了。

本文使用盒子论坛 v2.1 (2ccc.com)上的讨论,把通过TZipFile.add增加文件或者目录可能会把磁盘符号也增加上,这不是大家期望的,下面程序演示了如何去掉磁盘符号及多余的目录级别。

事实上,Delphi的帮助文档有说明,只是说的不是很清楚,主要没有举例说明,所以大家使用起来不顺手,好像不能满足要求一样,事实不是这样的。

源代码如下:

需要注意MY_PATH_TO_ZIP路径有没有最后一个'\'是有区别的,反映到下面的源代码,请看77行,如果最后面有这个'\',则77行目前是正确的,如果没有,则77行中的长度需要+1。

总之,就是理解 ArchiveFileName 这个参数如何使用就可以实现自定义增加Zip文件了!

unit uView.MainForm;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    BtnGetFilesOnDirectory: TButton;
    BtnPrepareZIP: TButton;
    Memo1: TMemo;
    procedure BtnGetFilesOnDirectoryClick(Sender: TObject);
    procedure BtnPrepareZIPClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  System.IOUtils,
  System.Zip;

const
  MY_PATH_TO_ZIP: string = 'C:\Users\AAA\';
  MY_ZIP_TARGET: string  = 'C:\Users\AutoBuild\exmail45.zip';

procedure TForm1.BtnGetFilesOnDirectoryClick(Sender: TObject);
begin
  ListBox1.Items.AddStrings(TDirectory.GetFiles(MY_PATH_TO_ZIP, '*.*', TSearchOption.soAllDirectories));
end;

procedure TForm1.BtnPrepareZIPClick(Sender: TObject);
var
  MyZIP: TZipFile;
  LRemoveTextInit : string;
begin
  if (ListBox1.Items.Count = 0) then
    begin
      ShowMessage('none files to zip... verify your ListBox content');
      //
      exit;
    end;
  //
  if FileExists(MY_ZIP_TARGET) then
    DeleteFile(MY_ZIP_TARGET);
  //
  MyZIP := TZipFile.Create;
  try
    try
      MyZIP.Open(MY_ZIP_TARGET, TZipMode.zmWrite);
      //
      for var F in ListBox1.Items do
        begin
          Memo1.Lines.Add(F);
          //MyZIP.Add(F, ExtractFilePath(F) + ExtractFileName(F), TZipCompression.zcDeflate);

          if F.Contains(MY_PATH_TO_ZIP) then // removing "D:\D:\TestMyDataBase"
          LRemoveTextInit := ExtractFilePath(F).Remove(0, MY_PATH_TO_ZIP.Length) + ExtractFileName(F);
          //
          MyZIP.Add(F, LRemoveTextInit, TZipCompression.zcDeflate);
        end;
      //
      Memo1.Lines.Add('---------');
      Memo1.Lines.AddStrings(MyZIP.FileNames);
      //
      MyZIP.Close;
    except
      on E: Exception do
        ShowMessage('ZIP error: ' + slinebreak + E.Message);
    end;
  finally
    MyZIP.Free;
  end;
end;

end.

谨此记录下来,方便大家使用!感谢mailx45 (emailx45)!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MyBatis】第十篇:mybatis的分页插件---pageHelper

分页无论是那个开发都是常见的使用场景,当然对于分页需要如果自己写的,不过自己写的话可能会需要想到很多: 比如:通过查询sql判断有多少数据,在页面显示共有多少页面。然后每页返回的数据是多少,上一页以及…

Echarts 更改K线图颜色,解释K线图4个数字意义

第019个点击查看专栏目录本示例修改K线度的颜色,方法参考源代码。 这里面讲一下K线图的四个数字,如[20, 34, 10, 38], 第一位:20代表开盘价格, 第二位:34代表闭盘价格, 第三位:10代表最低价&…

buuctf Web 上

buuctf Web 1.[HCTF 2018]WarmUp[HCTF 2018]WarmUp 访问url http://e00c89a6-d7d6-4a78-a346-614edfb95738.node3.buuoj.cn/ 如下 打开靶场后,查看源码即可看到构造url访问获得index.php的源码 http://e00c89a6-d7d6-4a78-a346-614edfb95738.node3.buuoj.cn/in…

Typescript的原始据类型和Any类型

最新的ECMAScript标准定义了8中数据类型: 7种原始类型: BooleanNullUndefinedNumberBigintStringSymbol和 Object 除 Object 以外的所有类型都是不可变的 (值本身无法被改变》。例如,与C语言不同JavaScript 中字符串是不可变的 (译注: 如,Ja…

Unreal Engine05:UE4基本概念

写在前面 主要是介绍一下UE4中的一些常用概念。 参考的博客如下: UE4常用逻辑关系和说明;UE4入门学习4:C编程介绍;UE4中基础的类及其之间的关系;[官方] 虚幻引擎 4 术语;《图解UE4渲染体系》Part 0 引擎基…

记录robosense RS-LIDAR-16使用过程5

本篇记录RS-LIDAR-16录制bag包,并解析bag包为pcd。官网操作基本过了一遍,接下来记录标定。相机、雷达设备在出厂前通常都完成了内参标定工作,若要联合使用多雷达或雷达-相机时,就需要进行外参标定。接下来学习并记录标定。首先找到…

扬帆优配|杠杆资金重仓股曝光,3只科创板股获多路资金青睐

到2月16日,科创板融资余额环比前一日削减1104.16万元,其间,23股融资余额环比添加超千万元,融资净买入居前的有晶科动力、诺诚健华、爱博医疗等。 到2月16日,市场融资余额算计1.48万亿元,较前一交易日削减27…

frp实现内网穿透

文章目录一: frp是什么二: 程序文件结构三、使用步骤四:总结一: frp是什么 frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网…

如何使用ArcGIS进行地理配准

1.概述 对于GIS数据而言,坐标信息是灵魂,有了坐标信息之后才能和别的数据结合使用,之前有介绍过矢量数据定义坐标信息的方法,针对栅格图,这里为大家介绍一下通过地理配准增加坐标信息的方法,希望能对你有所…

深圳“托育”放大招!政府出钱帮你带娃啦!

工作忙得不可开交 难以照料孩子的起居 这个带娃难题常常让双职工家庭 感觉到头疼不已 一边是工作,一边是孩子 父母都上班,宝宝谁来带? 未来这个问题将迎刃而解! 因为政府要出钱帮你带娃啦! 近日,深圳市总工…

Computer Graphics From Scratch - Chapter 8

系列文章目录 简介:Computer Graphics From Scratch-《从零开始的计算机图形学》简介 第一章: Computer Graphics From Scratch - Chapter 1 介绍性概念 第二章:Computer Graphics From Scratch - Chapter 2 基本光线追踪 第三章:Computer Gr…

ts基础入门学习之上篇

1.安装typescript编译器 npm i -g typescript 安装之后使用tsc运行ts文件,然后会编译出对应的js文件,再通过node运行js文件,就能获得打印内容。 ts定义内容 function fn(people, date) {console.log(hello${people},today is ${date}); } fn…

C++模板(一)

文章目录C模板(一)1. 泛型编程2. 函数模板2.1 函数模板格式2.2 模板原理2.3 模板实例化2.4 模板参数匹配原则3. 类模板3.1 类模板格式3.2 背景3.3 类模板的实例化C模板(一) 1. 泛型编程 前面我们学到了函数重载这个特性&#xf…

Zabbix“专家坐诊”第181期问答汇总

题一 Q:大佬们,有没有基础的 监控模板 触发器分享下? A:你可以试一下乐维免费版(https://forum.lwops.cn/download ),里面基本的模板全齐。 问题二 Q :orabbix监控查询SQL执行时…

如何保证数据库和缓存双写一致性?

前言 数据库和缓存(比如:redis)双写数据一致性问题,是一个跟开发语言无关的公共问题。尤其在高并发的场景下,这个问题变得更加严重。 我很负责的告诉大家,该问题无论在面试,还是工作中遇到的概率…

CAD中怎么旋转光标?CAD旋转光标的方法步骤

CAD中怎么旋转光标?浩辰CAD软件作为一款拥有自主核心技术的CAD平台软件产品,提供了CAD旋转光标命令,本节课程就和小编一起来了解一下浩辰CAD软件中CAD旋转光标的方法步骤吧! CAD旋转光标命令启动方式: 1、命令行&…

Redis第三讲

目录 三、Redis03 3.1 Redis持久化之RDB 3.1.1 什么是RDB 3.1.2 备份是如何执行的 3.1.3 Fork 3.1.4 RDB持久化流程 3.1.5 dump.rdb文件 3.1.6 配置rdb文件生成位置 3.1.7 如何触发RDB快照以及保持策略 3.2 Redis持久化之AOF 3.2.1 什么是AOF 3.2.2 AOF持久化流程 …

Java反序列化漏洞——CommonsCollections3链分析

一、原理CC1链中我们是通过调用Runtime.getRuntime.exec()来执行系统命令,而另一个方向我们可以通过TemplatesImpl加载字节码的类,通过调⽤其newTransformer() 方法,即可执⾏这段字节码的类构造器,我们在类构造器中加入恶意代码&a…

【Seata】_01 分布式事务基础知识和常见的解决方案

本地事务 单一的数据库事务,ACID由数据库直接提供 分布式事务 一个服务调用操作两个数据库; 多个服务操作同一个数据库; 多个服务操作多个数据库; 分布式事务无法由数据库保证 Seata 分布式事务解决方案 Seata提供AT/TCC/SAG…

HDMI Audio InfoFrame

Audio InfoFrame 是HDMI Source向Sink传递当前音频流特性的一种InfoFrame。要求是至少每两帧图像就要传输一次Audio InfoFrame。Audio InfoFrame的传输可以是Data Island周期的任何时刻。 HDMI在音频的传输上,packet包的标准是按照IEC60958或者IEC61938来的。 Aud…