0

問題が見つかりました。 ただし、他の人が私が遭遇した同じ問題に遭遇した場合に備えて、ここで質問を残しています.

WinZip 11 でバグまたは奇妙な機能に遭遇したようです。test2.zip ファイルをダブルクリックしてその内容を表示すると、WinZip はデータ ファイルへのパスが小文字の「allcapsname」であると表示しますが、WinZip が抽出するとアーカイブ (右クリックの [Extract to here] メニューから) を実行すると、実際には「ALLCAPSNAME」ディレクトリが適切に作成されます。Archive::Zip で発生していると思われる問題について不平を言っていましたが、それはずっと WinZip の問題でした。何が間違っていたのかを理解するのを手伝ってくれたすべての人に感謝します。

Archive::Tar の使用中に WinZip ファイルに表示されるパスを取得するには、コードに次の行が必要であり、Archive::Tar を厳密な POSIX 準拠から逸脱させる必要があります: $Archive::Tar::DO_NOT_USE_PREFIX = 1 ;

元の質問: これまでに、Perl スクリプト内から ZIP、GZIP、TAR、または TGZ アーカイブ ファイルを作成できるように見えるさまざまな Perl モジュールをいくつか見つけましたが、実際にはそれらのいずれからも完全に成功したわけではありません。 . なぜこれが難しいのですか?Windowsマシンを使用しているからですか?(これまでのところ、この一見単純なタスクに約 4 時間を無駄にしており、本当にイライラしています。)

Archive::Tarを試したところ、アーカイブ ファイルの作成に成功しましたが、何らかの理由で tarball に含まれるファイルへのパスを取得できませんでした。私は自分のコードでさまざまなことを試しましたが、tarball には常に空のパスを持つファイルが表示されていました。(WinZip を使用して tarball を見ています。)

Archive::Zipを試したところ、より多くの成功が得られ、アーカイブ ファイルに含まれるファイルへの実際のディレクトリ パスを取得できました。唯一の問題は、ファイルへのパスが途中で大文字から小文字に変更されたことです。ディレクトリの大文字と小文字が変更されたのはなぜですか? 実際のディレクトリ名をそのままにしておきたい。

成功せずに他のいくつかのモジュールを試しました。Archive::Builderからサンプル コードを取得してコンパイルすること さえできません。

元の質問の補遺:

Archive::Zip と Archive::Tar に関して上記で説明した 2 つの問題を明確に示す最小限の実行可能スクリプトを作成することができました。

use strict;
use warnings;
use Archive::Zip;
use Archive::Tar;

print "Starting...\n";

# Archive::Zip Synopsis (relative path to directory)
my $zip1 = Archive::Zip->new();
$zip1->addFile( 'MyArchiveFiles/file1.txt' )
    or die 'unable to add file to archive';
$zip1->writeToFileNamed('test1.zip');

# Archive::Zip Synopsis (with ALL CAPS DIRECTORY NAME)
my $zip2 = Archive::Zip->new();
$zip2->addFile( 'ALLCAPSNAME/file1.txt' )
    or die 'unable to add file to archive';
$zip2->writeToFileNamed('test2.zip');

# Archive::Tar Synopsis (relative path to directory)
my $tar3 = Archive::Tar->new;
$tar3->add_files( 'MyArchiveFiles/file1.txt' )
    or die 'unable to add file to archive';
$tar3->write('test3.tar');

print "Finished successfully!";

このスクリプトは 3 つのアーカイブを作成します。最初のアーカイブには、「MyArchiveFiles\」という適切なパスを持つデータ ファイルが含まれています。ディレクトリ名がすべて大文字の場合に問題が発生します。2 番目のアーカイブにはデータ ファイルが含まれていますが、アーカイブ ファイル内のパスは予想どおり「ALLCAPSNAME\」ではなく、「allcapsname\」です。これは私にとって問題です。なぜそれは私のパスのケースを変更したのですか?どうすればそれをそのままにしておくことができますか?

3 番目のアーカイブにはデータ ファイルが含まれていますが、そのファイルの空のパスが含まれています。これは私にとって問題です。アーカイブを解凍すると、ファイルが適切なディレクトリ構造に抽出されるように、パスがアーカイブにある必要があります。

4

5 に答える 5

4

具体的な質問はありますか?次のコードは、Win32 で問題なく動作します。

#!/usr/bin/perl

use strict;
use warnings;

use Archive::Zip;
use File::Find;

my $zip = Archive::Zip->new;

find(\&wanted, $ENV{TEMP});

$zip->writeToFileNamed('test.zip');

sub wanted {
    return unless /\.txt$/;
    $zip->addFile($File::Find::name);
}

実行してみましょう:

C:\Temp> アーク

C:\Temp> unzip -l test.zip

アーカイブ: test.zip
  長さ 日付 時間 名前
 -------- ---- ---- ----
      240 10-16-09 19:19/一時/cpan_install_Wb7z.txt
     2401 10-18-09 23:09/一時/perldoc_perlfunc_T4adbd85e_aec9c.txt
     2401 10-18-09 23:09/一時/perldoc_perlfunc_T4adbd872_bc437.txt
     2718 10-19-09 10:04/一時/perldoc_perlfunc_T4adc71e7_f4c64.txt
     2718 10-19-09 10:04/一時/perldoc_perlfunc_T4adc71f2_bf08d.txt
     2718 10-19-09 10:04/一時/perldoc_perlfunc_T4adc720a_a5c6a.txt
    29188 10-19-09 10:05/一時/perldoc_perlfunc_T4adc7226_bd834.txt
     6949 10-20-09 17:31/一時/perldoc_perlfunc_T4ade2c1f_d0cf8.txt
     6949 10-20-09 17:32/一時/perldoc_perlfunc_T4ade2c50_f2040.txt
   106763 10-19-09 10:00/一時/perldoc_perlop_T4adc7103_f4cab.txt
    67948 10-18-09 23:07/一時/perldoc_perlvar_T4adbd7d7_d8cda.txt
 -------- -------
   230993 11 ファイル

についても同様ですArchive::Tar

更新:ファイルが正しいパスでアーカイブに追加されたという疑いを解消するために、次の点に注意してください。

C:\Temp> ディレクトリ *.txt
 ドライブ C のボリュームは **** です
 ボリューム シリアル番号は****-****です

 C:\Temp のディレクトリ

2009/10/16 07:19 PM 240 cpan_install_wb7z.txt
2009/10/18 11:09 PM 2,401 perldoc_perlfunc_t4adbd85e_aec9c.txt
2009/10/18 11:09 午後 2,401 perldoc_perlfunc_t4adbd872_bc437.txt
...
于 2009-10-20T21:37:04.460 に答える
3

Archive::Builderの作者として言えば、それはあなたが望むものではないことはほぼ確実です。

これは、アーカイブ用ではなく、ディスクとコードで生成されたコンテンツを組み合わせてメモリ内に ZIP ファイルを生成することを目的としています。

于 2009-10-21T06:01:27.007 に答える
1

win32 で perl を使用する場合、単純なことに不満を感じることがあります。他のすべてが失敗した場合は、コマンドライン バージョンの 7-zip を取得して、それに対して system() 呼び出しを実行します。

于 2009-10-20T21:18:52.980 に答える
0

答えはWinZip11の問題であることが判明しました。したがって、WinZipを使用してArchive :: Zipファイルを表示している場合は、WinZipGUIですべて大文字のパスがすべて小文字に変更されるという事実を無視してください。実際に解凍すると、パスは意図したとおりすべて大文字になります。

WinZipにパスがまったく表示されないというArchive::Tarの問題に関しては、Archive :: Tarを強制的に次の行の厳密なPOSIX準拠から逸脱させる必要があります。そうすると、WinZipにパスが表示されます。

$Archive::Tar::DO_NOT_USE_PREFIX = 1;
于 2009-10-22T16:55:14.530 に答える
0

投稿に追加された新しい情報で提起されたポイントにお答えします。私はあなたのスクリプトを実行しました。結果は次のとおりです。

C:\Temp\a> unzip -l test1.zip
アーカイブ: test1.zip
  長さ 日付 時間 名前
 -------- ---- ---- ----
        0 10-21-09 13:03 MyArchiveFiles/file1.txt
 -------- -------
        0 1 ファイル
C:\Temp\a\d> unzip ../test1.zip
アーカイブ: ../test1.zip
 抽出: MyArchiveFiles/file1.txt

C:\Temp\a\d> dir /s
...
 C:\Temp\a\d のディレクトリ

2009/10/21 01:09 PM MyArchiveFiles

 C:\Temp\a\d\MyArchiveFiles のディレクトリ

2009/10/21 01:03 PM 0 file1.txt
C:\Temp\a\d> unzip ..\test2.zip
アーカイブ: ..\test2.zip
 抽出: ALLCAPSNAME/file1.txt

C:\Temp\a\d> dir /s

 C:\Temp\a\d のディレクトリ

2009/10/21 01:11 PM ALLCAPSNAME
2009/10/21 01:09 PM MyArchiveFiles

 C:\Temp\a\d\ALLCAPSNAME のディレクトリ

2009/10/21 01:07 PM 0 file1.txt
C:\Temp\a\d> tar -xvf ..\test3.tar
tar: レコード サイズ = 3 ブロック
MyArchiveFiles/file1.txt

C:\Temp\a\d> dir /s

2009/10/21 01:13 PM MyArchiveFiles

 C:\Temp\a\d\MyArchiveFiles のディレクトリ

2009/10/21 01:03 PM 0 file1.txt

からの無関係な出力の一部を切り取りましたが、dirこれにより、発生している問題が Windows や PerlArchive::TarArchive::Zip.

記録のために:

C:\Temp> perl -v

これは、MSWin32-x86-multi-thread 用にビルドされた v5.10.1 の perl です。
(2 つのパッチが登録されています。詳細については、perl -V を参照してください)

Copyright 1987-2009、ラリー・ウォール

ActiveState http://www.ActiveState.com が提供するバイナリ ビルド 1006 [291086]
2009 年 8 月 24 日 13:48:26 に構築
C:\Temp> perl -MArchive::Tar -e "print $Archive::Tar::VERSION"
1.52
C:\Temp> perl -MArchive::Zip -e "print $Archive::Zip::VERSION"
1.30
C:\Temp> tar --バージョン
タール (GNU タール) 1.21
C:\Temp> unzip -v
Cygwin による 2005 年 2 月 28 日の UnZip 5.52。Info-ZIPによるオリジナル。
于 2009-10-21T17:12:39.647 に答える