Архивирование файлов с помощью Perl, последняя строка обрезается - PullRequest
1 голос
/ 18 марта 2012

Я попытался заархивировать некоторые файлы CSV, которые составляют около 5 МБ с Perl. Ниже мой почтовый индекс. Файлы заархивированы, но когда я открываю их с помощью утилиты распаковки Windows, я обнаружил, что последние строки файлов CSV отсутствуют. В чем может быть проблема здесь? Я пытался изменить chuncksize и desiredCompressionLevel, но это не помогло.

sub zip_util{  
   my $directory = shift;
   $zip = Archive::Zip->new();
   $zip->setChunkSize(65536);
   # Add a file from disk

   my $file1=File::Spec->catfile($directory, 'file.csv');
   my $file2=File::Spec->catfile($directory, 'file2.csv');
   my $file3=File::Spec->catfile($directory, 'fil3.csv');
   $zip->addFile($file1,'file1.csv')->desiredCompressionLevel( 6 );
   $zip->addFile($file2,'file2.csv')->desiredCompressionLevel( 6 );
   $zip->addFile($fil3,'file3.csv')->desiredCompressionLevel( 6 );

   # Save the Zip file
   my $zipped_file=File::Spec->catfile($directory,'files.zip');
   unless ( $zip->writeToFileNamed($zipped_file) == AZ_OK ) {
      print  LOG ": Zip Creation error\n";
   }

1 Ответ

1 голос
/ 18 марта 2012

Я проверил это с предупреждениями и ограничениями и обнаружил определенные проблемы.

  1. $zip не использует my (не знаю, намеренно ли это, ноuse strict действительно помогает с такими глобалами, как этот).
  2. Вы работаете $zip->addFile($fil3,'file3.csv').$fil3 переменная определенно не существует.Во всяком случае, эта переменная $file3.
  3. Я предполагаю, что это проблема во время копирования и вставки, но подпрограмма не имеет соответствующей фигурной скобки.

Я сделал быстрый скрипт, которыйЯ использовал во время тестирования.

use strict;
use warnings;
use Archive::Zip qw( :ERROR_CODES );
use File::Spec;

sub zip_util {
    my ($directory) = @_;
    my $zip = Archive::Zip->new();
    $zip->setChunkSize(65536);

    # Add a file from disk
    my $file1 = File::Spec->catfile( $directory, 'file.csv' );
    my $file2 = File::Spec->catfile( $directory, 'file2.csv' );
    my $file3 = File::Spec->catfile( $directory, 'file3.csv' );
    $zip->addFile( $file1, 'file1.csv' )->desiredCompressionLevel(6);
    $zip->addFile( $file2, 'file2.csv' )->desiredCompressionLevel(6);
    $zip->addFile( $file3, 'file3.csv' )->desiredCompressionLevel(6);

    # Save the Zip file
    my $zipped_file = File::Spec->catfile( $directory, 'files.zip' );
    if ( $zip->writeToFileNamed($zipped_file) != AZ_OK ) {
        print STDERR "Zip Creation error\n";
    }
}

zip_util '.';

Проблема в том, что он работал.Итак, я сделал этот скрипт для создания файлов размером 5 МБ:

use strict;
use warnings;
use 5.010;

for ( 1 .. 524_288 ) {
    my $number = $_ % 10;
    say "$number-------";
}

Оба файла в ZIP и оригинальном "CSV" имели одинаковый размер и содержание.Итак, это, вероятно, вторая проблема, о которой я упомянул - использование переменной $fil3 или чего-то еще с вашими файлами (которые, к сожалению, вы не загрузили, поэтому я не могу их изучить).

...