发现问题。 不过,我将问题留在这里,以防其他人遇到我遇到的同样问题。
看起来我在 WinZip 11 中遇到了错误或奇怪的功能。当我双击 test2.zip 文件查看其内容时,WinZip 告诉我数据文件的路径是小写的“allcapsname”,但是当 WinZip 提取存档(从右键单击“提取到此处”菜单),它实际上正确地创建了“ALLCAPSNAME”目录。我一直在抱怨我认为 Archive::Zip 遇到的问题,而这一直是 WinZip 的问题。感谢所有帮助找出问题所在的人。
事实证明,要在使用 Archive::Tar 时获得在 WinZip 文件中显示的路径,您需要在代码中使用这一行来强制 Archive::Tar 偏离严格的 POSIX 合规性:$Archive::Tar::DO_NOT_USE_PREFIX = 1 ;
原始问题: 到目前为止,我发现了一些似乎能够从我的 Perl 脚本中创建 ZIP 或 GZIP 或 TAR 或 TGZ 存档文件的各种 Perl 模块,但实际上我还没有从其中任何一个中获得完全成功. 为什么这么难?是因为我在 Windows 机器上吗?(到目前为止,我在这个看似简单的任务上浪费了大约 4 个小时,真的很沮丧。)
当我尝试Archive::Tar时,我成功创建了存档文件,但由于某种原因,我无法获得包含在 tarball 中的任何文件的路径。我在我的代码中尝试了一堆不同的东西,我的 tarball 总是在其中显示带有空路径的文件。(我正在使用 WinZip 查看我的压缩包。)
当我尝试Archive::Zip时,我取得了更大的成功,并且我获得了包含在存档文件中的文件的实际目录路径。唯一的问题是我的文件路径从大写变为小写。为什么它改变了我的目录的大小写?我希望实际的目录名称保持原样。
我尝试了其他一些模块但没有成功。我什至无法从Archive::Builder获取示例代码进行编译。
原始问题附录:
我终于能够创建一个最小的可执行脚本,它清楚地展示了我上面描述的关于 Archive::Zip 和 Archive::Tar 的 2 个问题。
use strict;
use warnings;
use Archive::Zip;
use Archive::Tar;
print "Starting...\n";
# Archive::Zip Synopsis (relative path to directory)
my $zip1 = Archive::Zip->new();
$zip1->addFile( 'MyArchiveFiles/file1.txt' )
or die 'unable to add file to archive';
$zip1->writeToFileNamed('test1.zip');
# Archive::Zip Synopsis (with ALL CAPS DIRECTORY NAME)
my $zip2 = Archive::Zip->new();
$zip2->addFile( 'ALLCAPSNAME/file1.txt' )
or die 'unable to add file to archive';
$zip2->writeToFileNamed('test2.zip');
# Archive::Tar Synopsis (relative path to directory)
my $tar3 = Archive::Tar->new;
$tar3->add_files( 'MyArchiveFiles/file1.txt' )
or die 'unable to add file to archive';
$tar3->write('test3.tar');
print "Finished successfully!";
此脚本创建 3 个档案。第一个存档包含具有适当路径“MyArchiveFiles\”的数据文件。当我的目录名称全部大写时,就会出现我的问题。第二个存档包含数据文件,但存档文件中的路径不是预期的“ALLCAPSNAME\”......它是“allcapsname\”。这对我来说是个问题。为什么它改变了我的路径,我怎么能强迫它不管它?
第三个存档包含数据文件,但它包含该文件的空路径。这对我来说是个问题。我需要存档中的路径,以便在解压缩存档时将文件提取到适当的目录结构中。