2010-12-02 6 views
4

J'ai le code Perl ci-dessous pour faire une copie d'un fichier binaire que j'ai.Comment copier les fichiers binaires dans le programme 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); 

Mais cette version de code sortie fichier binaire est de taille plus que la taille du fichier binaire d'entrée, car ce code perl semble ajouter un caractère 0x0D caractère (retour chariot) avant 0x0A (nouvelle ligne) dans le fichier d'entrée, ce n'est pas déjà là.

Si j'utilise chomp, alors les caractères 0x0A valides sont supprimés, et ne les ont pas placés dans le fichier de sortie.

1] Comment puis-je corriger cela dans le code ci-dessus.

2] Comment puis-je résoudre cela en utilisant le module File :: Copy, tout exemple de code snip serait utile.

merci.

-AD

+0

Il n'y a pas de Perl :: Copy. Peut-être que vous voulez dire File :: Copy? Il devrait y avoir suffisamment d'exemples dans la documentation. – runrig

+0

@runrig: Oui, fautes de frappe. l'a édité. – goldenmean

Répondre

10

Utilisez toujours les trois arguments 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: $!" 

Cependant, File::Copy est si facile à utiliser que je ne comprends pas pourquoi vous ne seriez pas.

use File::Copy; 

copy($in, $out) or die "Copy failed: $!"; 
+0

A noter, comment le module File :: Copy parvient-il à créer une copie de fichier avec les mêmes horodatages. C'est intéressant. – goldenmean

+0

@goldenmean: Ce n'est pas le cas. Au moins pas sous Unix. Recherchez syscopy dans le document File :: Copy. Il y a/bin/cp -p sous Unix. – runrig

4

Appel binmode sur les deux poignées de fichiers.

+1

Ceci est un moyen extrêmement inefficace de copier des fichiers si ... Pourquoi ne pas utiliser FIle :: Copy –

+0

@ Cyber-Guard Pourquoi ne pas utiliser le 'copy' dans un shell cmd? –

+2

Sinan Ünür: parce qu'écrire du code perl dépendant de la plateforme sans raison est une idée horrible? – geoffspear

Questions connexes