8
votes

Comment puis-je vérifier l'extension d'un fichier à l'aide de Perl?

à mon script Perl, un fichier est passé comme une dispute. Le fichier peut être un fichier .txt ou un fichier .zip contenant le fichier .txt .

Je veux écrire du code qui a l'air quelque chose comme ça xxx

une solution pour vérifier que l'extension est de faire une scission sur . puis correspond à la dernière fois dans le tableau (retourné par Split).

Y a-t-il un meilleur moyen?


2 commentaires

Êtes-vous sûr que vous voulez seulement vérifier l'extension? Si vous espérez tester le type de fichier que vous traitez avec vous, vous feriez mieux de vérifier le type MIME. Jetez un coup d'œil à quelque chose comme ceci: Search.cpan .org / ~ pmison / fichier-type-0.22 / lib / fichier / type.pm


Sortir avec support pour @totels et quelques réponses du représentant inférieur. Je suis surpris de voir combien de réfléchir à l'extension est soit sûr ( virus.exe hooters.jpg.jpg ) ou robuste ( mv un-énorme-dossy-garbage.bin quoi que ce soit.zip < / code>). En supposant que zip et attraper des erreurs ou explorer le type MIME sont les bonnes réponses données. Toute solution utilisant l'extension est une erreur.


7 Réponses :


9
votes

Que diriez-vous de vérifier la fin du nom de fichier? xxx

puis: xxx

plus d'informations ici .


0 commentaires

4
votes

Vous pouvez vérifier l'extension de fichier à l'aide d'une correspondance REGEX comme suit:

if($file =~ /\.zip$/i) {
        # $file is a zip file 
}


0 commentaires

2
votes

Pourquoi dépendez-vous de l'extension de fichier? Essayez simplement de décompresser et d'utiliser la manutention d'exception appropriée:

eval {
    # try to unzip the file
};

if ($@) {
    # not a zip file
}


2 commentaires

Et si vous n'avez pas 'Unzip' installé sur votre système ou si ce n'est pas dans votre chemin?


@Prakash: Unzip est censé être une fonction Perl. Nevermind, remplacé par des commentaires :)



12
votes

4 commentaires

+1, mais vous devriez remplacer My $ file_type = fichier :: type-> mime_type ($ fichier); par par my $ file_type = $ ft-> mime_type ($ fichier);


Fichier :: Type fonctionne ici, mais en général un joli travail de merde comparé à < Code> Fichier :: libmagique .


Ceci est probablement la meilleure approche (module), mais l'opérateur de test de fichier -t peut également être regardé.


DAXIM: Je vais essayer fichier :: libmagic . Merci.



14
votes

Vous pouvez utiliser Fichier :: BasEname pour cela.

$ ./files 
file.txt is a text file
file.zip is a zip file
file.pl is an unknown file type


3 commentaires

fileparse renvoie le nom de fichier en premier, pas le répertoire.


Vous avez raison, bien sûr, et je l'ai réparé. Étrange que cela a été inaperçu depuis plus de cinq ans. Merci de le pointer.


Pas de soucis, votre message a résolu mon problème une fois que j'ai réglé la commande :)



3
votes

Je sais que cette question est de plusieurs années, mais pour quiconque qui vient ici à l'avenir, un moyen facile de séparer un chemin de fichier dans son chemin constitutif, son nom de fichier, son nom et son extension constituent comme suit.

my @test_paths = (
    '/foo/bar/fish.wibble',
    '/foo/bar/fish.',
    '/foo/bar/fish.asdf.d',
    '/foo/bar/fish.wibble.',
    '/fish.wibble',
    'fish.wibble',
);

foreach my $this_path (@test_paths) {
    print "Current path: $this_path\n";
    my ($this_basename, $parentdir, $extension) = fileparse($this_path, qr/\.[^.]*$/);
    my $this_filename = $this_basename . $extension;

    foreach my $var (qw/$parentdir $this_filename $this_basename $extension/) {
        print "$var = '" . eval($var) . "'\n";
    }

    print "\n\n";
}


0 commentaires

0
votes

Peut-être un peu de retard mais il pourrait être utilisé comme une référence alternative: xxx

ici est possible d'utiliser Linux fichier l'exécutant de Perl par l'utilisation de Backticks (` `). Votre zone capable de passer le chemin de votre dossier et d'évaluer s'il existe un fichier classé par fichier comme gzip comprimé.


0 commentaires