2012-07-02 57 views
0

當我嘗試通過Archive :: Zip創建zip存檔時,沒有錯誤拋出,但生成的zip文件被破壞。使用Archive :: Zip存儲文件時遇到問題:我得到的空zip文件沒有錯誤代碼

use Archive::Zip; 

my $zip = Archive::Zip->new(); 
my $file = "https://stackoverflow.com/a/very/long/path/with/191/characters/file.txt"; 

if(-f $file) 
{ 
    $zip->addFile("$file", "destinationname.txt"); 
    print "$file added\n"; 
} 
unless ($zip->writeToFileNamed("out.zip") == "AZ_OK") { die "error";}; 

現在我out.zip文件僅僅是22B,是空的:

$> > unzip -l out.zip 
Archive: out.zip 
warning [out.zip]: zipfile is empty 

錯在何處?

第一次更新:當我使用較短路徑名稱的文件時,一切正常。任何想法的解決方法? Symlinking不起作用。

二更新:這可以作爲一個解決方法:

use File::Slurp; 
[...] 
my $text = read_file($file); 
$zip->addString($text, "destinationfile.txt"); 
[..] 

回答

1

將其更改爲:$zip->addFile($plmxmlFile);

$zip已經引用了你的目標文件,並且通過添加用於輸出的文件的名字,你使得Archive::Zip嘗試從同一個文件中讀取和寫入組裝嘗試,創建一個混亂(並且通常不做你真正想要什麼)。

+0

不起作用。我編輯了這個錯誤,以避免進一步的混淆。 –

+1

適合我。你確定你沒有丟失文件路徑中的根文件夾前導'/'? –

0

我看不出爲什麼你的程序會創建一個空的zip文件,但是你在幾處地方誤用了引號。

尤其值AZ_OK是一個數字值的符號,您可以通過請求導入。

writeToFileNamed方法永遠不會返回字符串"AZ_OK",你也應該使用eq代替==比較字符串。

幸運(或沒有,這取決於你的觀點),這兩個對於你的失敗要導入的AZ_OK的價值和你的use warnings遺漏將比較writeToFileNamed返回值爲零(的AZ_OK正確的值)一起錯誤並應該給你正確的結果。

請嘗試此程序。

use strict; 
use warnings; 

use Archive::Zip qw(:ERROR_CODES); 

my $zip = Archive::Zip->new; 
my $file = 'a/very/long/path/with/191/characters/file.txt'; 

if (-f $file) { 
    $zip->addFile($file, 'destinationname.txt'); 
    print "$file added\n"; 
} 

my $status = $zip->writeToFileNamed('out.zip'); 
$status == AZ_OK or die "error $status"; 

更新

路徑的長度是不可能作出任何區別,除非它是數百個字符長。

試試這個版本,告訴我們你得到了什麼。

use strict; 
use warnings; 

use Archive::Zip qw(:ERROR_CODES); 

my $zip = Archive::Zip->new; 
my $file = 'a/very/long/path/with/191/characters/file.txt'; 

unlink 'out.zip'; 

die qq(File "$file" not found) unless -f $file; 
$zip->addFile($file, 'destinationname.txt'); 
print "$file added\n"; 

my $status = $zip->writeToFileNamed('out.zip'); 
$status == AZ_OK or die "error $status"; 
+0

與此代碼相同的行爲:我得到一個空的zip存檔。 –

+0

@ d135-1r43:我修改了一下代碼。請在我的答案中嘗試修改後的版本。 – Borodin

+0

和以前一樣的行爲。沒有錯誤信息(最後一行代碼)被顯示。 –

0

也許我已經明白是什麼問題: 您使用完整的根a/very/long/path/with/191/characters/file.txt

所以你壓縮所有目錄,在你ZIP,你的文件是空的,因爲您正在筆記能看到的路徑。 使用chdir chdir 'a/very/long/path/with/191/characters/'

相關問題