【发布时间】:2010-12-08 12:21:53
【问题描述】:
发现问题。不过,我将把问题留在这里,以防其他人遇到我遇到的同样问题。
看起来我在 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\”。这对我来说是个问题。为什么它改变了我路径的大小写,我怎么能强迫它不管它?
第三个存档包含数据文件,但它包含该文件的空路径。这对我来说是个问题。我需要存档中的路径,以便在解压缩存档时将文件提取到适当的目录结构中。
【问题讨论】:
-
即使我们提出隐含的问题“我做错了吗?”还需要更多细节。
-
您使用的是最新版本的
Archive::Zip和Archive::Tar吗? -
最新版本?好问题。当我启动 PPM 时,它说我根本没有 Tar,它说我有 1.20 的 Zip,而最新的是 1.30。我从 PPM 安装了两个,现在我有两个 ZIP 副本。在 perl 区域我仍然有旧的 1.20,而在站点区域我有最新的 1.30。我如何安装到 perl 区域而不是站点区域,如果我同时拥有两者,我如何知道使用哪个?再次令人沮丧。
-
@Kurt 不,最好保留原始库并在
site区域安装升级。请注意,默认情况下,site/lib在@INC中出现在lib之前,这意味着使用的是最新安装的库版本。出于某种原因,这可能会让您感到沮丧,但这不是 Windows 或 Perl 的问题。 -
站点区域优先于 perl 区域,AFAIK,因此您只需要最新的站点。
标签: perl winapi path archive tar