2010-12-02 27 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コードが0x0Aを(改行)の前に0x0Dを(キャリッジリターン)文字を追加するようなので、出力バイナリファイルは、入力バイナリファイルのサイズよりもサイズであり、文字で入力ファイル、それはまだそこにない。

chompを使用すると、有効な0x0A文字が存在しても削除され、出力ファイルに入れられません。

1]これをどのように上記のコードで修正できますか?

2]どのように私はFile :: Copyモジュールを使用してこれを解決できますか、任意のコードスニップの例が役に立ちます。

ありがとうございました。両方のファイルハンドルに

〜AD

+0

Perl :: Copyはありません。多分あなたはFile :: Copyを意味するでしょうか?ドキュメントには十分な例があるはずです。 – runrig

+0

@runrig:うん、タイプミス。それを編集しました。 – goldenmean

答えて

10

常に3つの引数を使用する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: $!"; 
+0

副作用、File :: Copyモジュールはどのようにして同じタイムスタンプを持つファイルコピーを作成することができますか。それは面白い。 – goldenmean

+0

@goldenmean:そうではありません。少なくともUnix上ではありません。 File :: Copy docsでsyscopyを探します。 Unixでは/ bin/cp -pがあります。 – runrig

4

コールbinmode

+1

これはファイルをコピーするのに非常に非効率的な方法です...なぜFIle :: Copyを使わないのですか –

+0

@ Cyber​​-Guard cmdシェルで 'copy'を使わないのはなぜですか? –

+2

SinanÜnür:なぜプラットフォーム依存のPerlコードを書くのはひどい考えですか? – geoffspear

関連する問題