Archive::Tar: невозможно прочитать tar, созданный ранее в Perl
Я пытаюсь прочитать содержимое файла (a.txt), который я только что создал. Этот файл содержит строку, состоящую из "ABCDE", которую я затем tar с функцией write(). Я вижу, что "a.tar" создается в моем каталоге, но когда я подхожу к функции read(), я получаю ошибку: не могу прочитать a.tar: в строке testtar.pl 14.
Я делаю что-то неправильно? Это потому что я на Windows?
use strict;
use warnings;
use Archive::Tar;
# $Archive::Tar::DO_NOT_USE_PREFIX = 1;
my $tari = Archive::Tar->new();
$tari->add_files("a.txt");
$tari->write("a.tar");
my $file = "a.tar";
my $tar = Archive::Tar->new() or die "Can't create a tar object : $!";
if(my $error = $tar->read($file)) {
die "Can't read $file : $!";
}
my @files = $tar->get_files();
for my $file_obj(@files) {
my $fh = $file_obj->get_content();
binmode($fh);
my $fileName = $file_obj->full_path();
my $date = $file_obj->mtime();
print $fh;
}
Благодарю.
2 ответа
Вы неправильно понимаете возвращаемое значение read
из Archive::Tar
:
$tar->read ( $filename|$handle, [$compressed, {opt => 'val'}] )
Возвращает количество файлов, прочитанных в скалярном контексте, и список
Archive::Tar::File
объекты в контексте списка.
Пожалуйста, измените следующее
if(my $error = $tar->read($file)) {
die "Can't read $file : $!";
}
в
unless ($tar->read($file)) {
die "Can't read $file : $!";
}
и попробуй еще раз.
Это не верно:
my $fh = $file_obj->get_content();
binmode($fh);
get_content () предоставляет вам содержимое файла, а не дескриптор файла. binmode () ожидает файловый дескриптор. Кроме того, вы можете использовать ! Определенные вместо если (я думаю, что это легче читать).
Переписано ниже:
#!/bin/env perl
use strict;
use warnings;
use Archive::Tar;
my $tari = Archive::Tar->new();
$tari->add_files("a.txt");
$tari->add_files("b.txt");
$tari->add_files("c.txt");
$tari->add_files("d.txt");
$tari->write("a.tar");
my $file = "a.tar";
my $tar = Archive::Tar->new() or die "Can't create a tar object : $!";
if(!defined($tar->read($file)))
{
die "Can't read $file : $!";
}
my @files = $tar->get_files();
for my $file_obj(@files)
{
my $fileContents = $file_obj->get_content();
my $fileName = $file_obj->full_path();
my $date = $file_obj->mtime();
print "Filename: $fileName Datestamp: $date\n";
print "File contents: $fileContents";
print "-------------------\n";
}