Gradle允许zip存档中有两个同名文件
我有一个gradle任务,Gradle允许zip存档中有两个同名文件,gradle,Gradle,我有一个gradle任务,buildZip,它将两个目录的内容放在一个目录中。两个目录都包含一个名称相同的文件,myFile.txt,但其内容不同。这是原始目录结构: foo/ ├── bar/ │ └── myFile.txt # 10kB └── baz/ └── myFile.txt # 20kB Gradle任务将两个文件都放在归档文件的根目录中: task buildZip(type: Zip) { archiveName 'myArchive.zip
buildZip
,它将两个目录的内容放在一个目录中。两个目录都包含一个名称相同的文件,myFile.txt
,但其内容不同。这是原始目录结构:
foo/
├── bar/
│ └── myFile.txt # 10kB
└── baz/
└── myFile.txt # 20kB
Gradle任务将两个文件都放在归档文件的根目录中:
task buildZip(type: Zip) {
archiveName 'myArchive.zip'
includeEmptyDirs false
from('foo/bar') {
include 'myFile.txt'
}
from('foo/baz') {
include 'myFile.txt'
}
}
我假设来自…include的第二个将覆盖第一个myFile.txt
。相反,这是生成的存档的结构:
myArchive.zip
├── myFile.txt # 10kB
└── myFile.txt # 20kB
这会导致一些奇怪的行为:
- 当我打开归档文件并将其中一个
myFile.txt
的名称更改为myFile.txt.bkup
(通过WinZip)时,两个文件的名称都会相应更改
- 这两个文件都报告了它们的原始大小(10kB和20kB),但它们的内容是相同的,特别是后者的
myFile.txt
fromfoo/baz
李>
如果已经存在同名文件,Gradle为什么不自动覆盖存档中的文件?为什么可以在同一目录中创建两个同名文件而不覆盖其中一个?我认为这是org.apache.tools.zip.ZipOutputStream
(gradle使用它创建zip存档)的行为。在这个类中,首先编写zip条目头,我认为这就是zip文件看起来包含2个文件的原因。当它写入实际文件的流时,它会覆盖上一个文件的内容(因为名称相同)
查看代码,在覆盖原始文件流的同时,缓冲区大小似乎没有受到影响,即使内容发生了更改。这可以解释为什么文件看起来相同,但仍然报告其原始文件大小。这会使这成为一个错误,还是有这样的行为的原因?@Bucket我不是100%确定,但我认为这与内部的zip文件格式有关。OutputStream可能会在刷新时写入文件字节(这可能会覆盖4.3.7节(其中解释了本地文件头)中使用相同名称的上一个文件)