2010-12-02 2 views
4

У меня есть код Perl, чтобы сделать копию двоичного файла, который у меня есть.Как скопировать двоичные файлы в программе 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

+0

Нет Perl :: Копия. Может быть, вы имеете в виду File :: Copy? В документации должно быть достаточно примеров. – runrig 2010-12-02 23:39:53

+0

@runrig: Да, опечатка. отредактировал его. – goldenmean 2010-12-03 11:06:49

ответ

10

Всегда используйте три-arg 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

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

+1

Это крайне неэффективный способ копирования файлов, хотя ... Почему бы не использовать FIle :: Copy – 2010-12-02 23:34:09