Perl中的GZip压缩在Windows上的gz文件中维护文件路径

时间:2013-04-22 08:13:02

标签: perl gzip cpan

我正在尝试通过电子邮件发送一些gzip压缩文件。文件的打包和发送工作正常,但是当我在Windows机器上打开.gz文件时,存档包含每个文件的文件路径(在我的情况下为/ tmp / feed)。在Linux上,文件路径未在.gz文件中表示。

以下是我打包文件的代码:

foreach my $input (glob($par{directory}.'*')) {
        my $output = "$input.gz";
        gzip $input => $output or die "GZIP failed: $GzipError";
}

以前我试过

 gzip "<$par{directory}*.*>" => "<*.gz>" or die 'GZIP failed: '.$GzipError;

但它有相同的结果。 关于我做错了什么的暗示?这个问题是否可能与通过电子邮件发送文件有关?

/解决 我使用了chdir($ par {directory})并将gzip 作为glob。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

IO :: Compress :: Gzip 中的“名称”选项允许您显式设置存储在gzip文件中的文件名。

这样的东西会在存储到gzip文件之前从文件名中删除所有路径组件

foreach my $input (glob($par{directory}.'*')) {
    my $output = "$input.gz";
    my $name = $input ;
    $name =~ s#^.*/##;
    gzip $input => $output, Name => $name or die "GZIP failed: $GzipError";
}

答案 1 :(得分:1)

试试这个。我遇到过同样的问题。它对我有用。

my $curr_work_dir = getcwd;
my $file_dir = dirname($input_file);
my $input_filename = basename($input_file);

$output_file=$input_filename.$gzip_extn;

chdir $file_dir;
gzip $input_filename => $output_file or die "\n\nGzip compression failed for $input_file";
chdir $curr_work_dir;

答案 2 :(得分:0)

我假设您使用http://perldoc.perl.org/IO/Compress/Gzip.html - 根据文档,它也接受文件句柄作为输入。尝试直接使用文件句柄而不是文件。

如果这不起作用,您可以将文件读入标量变量并传递给它。这个解决方案有一个缺点,即大文件需要大量内存。

为什么使用文件句柄:根据流压缩器(gzip,bzip2,xz,...)的调用方式,它们要么包含文件名,要么不包括文件名。使用没有文件名的方法传递数据时,不会包含它。

没有错误检查的测试示例:

use IO::Compress::Gzip qw(gzip);

open FILE,">","test";
print FILE "Test";
close FILE;

open $fn,"<","test";
gzip $fn => "testnn.gz";
gzip "test" => "testwn.gz";