我正在尝试通过电子邮件发送一些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。
答案 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";