Как скопировать бинарные файлы в программе Perl - PullRequest
4 голосов
/ 03 декабря 2010

У меня есть приведенный ниже код Perl, чтобы сделать копию имеющегося у меня двоичного файла.

$in = "test_file_binary.exe";
$out = "test_out_binary.exe";
open(IN,$in) || die "error opening ip file: $!" ;
open(OUT,">$out") || die "error opening op file: $!" ;
while(<IN>)
{
 #chomp;
 print OUT $_;
}
close(IN);
close(OUT);

Но в этой версии кода выходной двоичный файл имеет больший размер, чем размер входного двоичного файлаПоскольку этот код perl, кажется, добавляет символ 0x0D (возврат каретки) перед символом 0x0A (символ новой строки) во входном файле, его там еще нет.

Если я использую chomp, то он удаляет даже действительные символы 0x0A и не помещает их в выходной файл.

1] Как я могу это исправить в приведенном выше коде.

2] Как я могу решить эту проблему с помощью модуля File :: Copy, любой пример кода будет полезен.

спасибо.

-AD

Ответы [ 2 ]

12 голосов
/ 03 декабря 2010

Всегда используйте три аргумента open.

open IN, '<:raw', $in or die "Couldn't open <$in: $!";
open OUT, '>:raw', $out or die "Couldn't open >$out: $!";

my ($len, $data);
while ($len = sysread IN, my $data, 4096) {
    syswrite OUT, $data, $len;
}
defined $len or die "Failed reading IN: $!"

Однако, File::Copy настолько прост в использовании, что я не понимаю, почему вы этого не сделаете.

use File::Copy;

copy($in, $out) or die "Copy failed: $!";
4 голосов
/ 03 декабря 2010

Вызов binmode на оба дескриптора файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...