0

我正在尝试通过电子邮件发送一些压缩文件。文件的打包和发送工作正常,但是当我在 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 作为球体。

谢谢你的帮助!

4

3 回答 3

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";
}
于 2013-04-22T09:07:51.433 回答
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;
于 2013-08-21T15:59:23.137 回答
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";
于 2013-04-22T08:19:20.870 回答