0

发现问题。 不过,我将问题留在这里,以防其他人遇到我遇到的同样问题。

看起来我在 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\”。这对我来说是个问题。为什么它改变了我的路径,我怎么能强迫它不管它?

第三个存档包含数据文件,但它包含该文件的空路径。这对我来说是个问题。我需要存档中的路径,以便在解压缩存档时将文件提取到适当的目录结构中。

4

5 回答 5

4

你有一个具体的问题吗?以下代码在 Win32 上运行良好:

#!/usr/bin/perl

use strict;
use warnings;

use Archive::Zip;
use File::Find;

my $zip = Archive::Zip->new;

find(\&wanted, $ENV{TEMP});

$zip->writeToFileNamed('test.zip');

sub wanted {
    return unless /\.txt$/;
    $zip->addFile($File::Find::name);
}

让我们运行它:

C:\Temp> 弧

C:\Temp> 解压 -l test.zip

存档:test.zip
  长度 日期 时间 名称
 -------- ---- ---- ----
      240 10-16-09 19:19 /Temp/cpan_install_Wb7z.txt
     2401 10-18-09 23:09 /Temp/perldoc_perlfunc_T4adbd85e_aec9c.txt
     2401 10-18-09 23:09 /Temp/perldoc_perlfunc_T4adbd872_bc437.txt
     2718 10-19-09 10:04 /Temp/perldoc_perlfunc_T4adc71e7_f4c64.txt
     2718 10-19-09 10:04 /Temp/perldoc_perlfunc_T4adc71f2_bf08d.txt
     2718 10-19-09 10:04 /Temp/perldoc_perlfunc_T4adc720a_a5c6a.txt
    29188 10-19-09 10:05 /Temp/perldoc_perlfunc_T4adc7226_bd834.txt
     6949 10-20-09 17:31 /Temp/perldoc_perlfunc_T4ade2c1f_d0cf8.txt
     6949 10-20-09 17:32 /Temp/perldoc_perlfunc_T4ade2c50_f2040.txt
   106763 10-19-09 10:00 /Temp/perldoc_perlop_T4adc7103_f4cab.txt
    67948 10-18-09 23:07 /Temp/perldoc_perlvar_T4adbd7d7_d8cda.txt
 -------- --------
   230993 11个文件

同上Archive::Tar

更新:要消除对文件已使用正确路径添加到存档的任何疑问,请注意:

C:\Temp> 目录 *.txt
 驱动器 C 中的卷为 ****
 卷序列号为 ****-****

 C:\Temp 目录

2009/10/16 07:19 PM 240 cpan_install_wb7z.txt
2009/10/18 晚上 11:09 2,401 perldoc_perlfunc_t4adbd85e_aec9c.txt
2009/10/18 晚上 11:09 2,401 perldoc_perlfunc_t4adbd872_bc437.txt
...
于 2009-10-20T21:37:04.460 回答
3

作为Archive::Builder的作者,它几乎肯定不是你想要的。

它旨在使用磁盘和代码生成的内容混合在内存中生成 ZIP 文件,而不是用于存档。

于 2009-10-21T06:01:27.007 回答
1

我听说你有时对 win32 上的 perl 感到沮丧。如果所有其他方法都失败了,只需获取 7-zip 的命令行版本来执行您想要的操作,然后对其执行 system() 调用。

于 2009-10-20T21:18:52.980 回答
0

我将回答您在帖子中添加的新信息中提出的观点。我运行了你的脚本。结果如下:

C:\Temp\a> 解压 -l test1.zip
存档:test1.zip
  长度 日期 时间 名称
 -------- ---- ---- ----
        0 10-21-09 13:03 MyArchiveFiles/file1.txt
 -------- --------
        0 1 个文件
C:\Temp\a\d> 解压 ../test1.zip
存档:../test1.zip
 提取:MyArchiveFiles/file1.txt

C:\Temp\a\d> 目录 /s
...
 C:\Temp\a\d 目录

2009/10/21 01:09 PM 我的存档文件

 C:\Temp\a\d\MyArchiveFiles 目录

2009/10/21 01:03 PM 0 file1.txt
C:\Temp\a\d> 解压 ..\test2.zip
存档:..\test2.zip
 提取:ALLCAPSNAME/file1.txt

C:\Temp\a\d> 目录 /s

 C:\Temp\a\d 目录

2009/10/21 01:11 PM
2009/10/21 01:09 PM 我的存档文件

 C:\Temp\a\d\ALLCAPSNAME 目录

2009/10/21 01:07 PM 0 file1.txt
C:\Temp\a\d> 焦油 -xvf ..\test3.tar
tar:记录大小 = 3 个块
MyArchiveFiles/file1.txt

C:\Temp\a\d> 目录 /s

2009/10/21 01:13 PM 我的存档文件

 C:\Temp\a\d\MyArchiveFiles 目录

2009/10/21 01:03 PM 0 file1.txt

我删除了一些无关的输出dir,但我希望这可以一劳永逸地表明,无论您遇到什么问题都不是由于 Windows 或 Perl 或Archive::Taror引起的Archive::Zip

作为记录:

C:\Temp> perl -v

这是为 MSWin32-x86-multi-thread 构建的 perl v5.10.1
(带有 2 个已注册的补丁,请参阅 perl -V 了解更多详细信息)

版权所有 1987-2009,拉里·沃尔

ActiveState http://www.ActiveState.com 提供的二进制构建 1006 [291086]
建于 2009 年 8 月 24 日 13:48:26
C:\Temp> perl -MArchive::Tar -e "打印 $Archive::Tar::VERSION"
1.52
C:\Temp> perl -MArchive::Zip -e "打印 $Archive::Zip::VERSION"
1.30
C:\Temp> 焦油--版本
焦油 (GNU 焦油) 1.21
C:\Temp> 解压 -v
解压缩 5.52,2005 年 2 月 28 日,由 Cygwin 提供。由 Info-ZIP 原创。
于 2009-10-21T17:12:39.647 回答
0

答案原来是 WinZip 11 的问题。因此,如果您正在使用 WinZip 查看 Archive::Zip 文件,请忽略 WinZip GUI 中所有大写路径都更改为所有小写的事实,因为当您实际上解压缩它,路径将按预期全部为大写。

至于 Archive::Tar 在 WinZip 中根本看不到任何路径的问题,您需要强制 Archive::Tar 偏离严格的 POSIX 遵从以下行,然后您将在 WinZip 中看到路径:

$Archive::Tar::DO_NOT_USE_PREFIX = 1;
于 2009-10-22T16:55:14.530 回答