à mon script Perl, un fichier est passé comme une dispute. Le fichier peut être un fichier Je veux écrire du code qui a l'air quelque chose comme ça p> une solution pour vérifier que l'extension est de faire une scission sur Y a-t-il un meilleur moyen? P> P> .txt code> ou un fichier
.zip code> contenant le fichier
.txt code>.
. code> puis correspond à la dernière fois dans le tableau (retourné par Split). P>
7 Réponses :
Que diriez-vous de vérifier la fin du nom de fichier? puis: p> plus d'informations ici . p> p>
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 }
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 }
Et si vous n'avez pas 'Unzip' installé sur votre système ou si ce n'est pas dans votre chemin?
@Prakash: Unzip code> est censé être une fonction Perl. Nevermind, remplacé par des commentaires :)
Une autre solution consiste à utiliser Fichier :: Type Code> qui détermine le type de fichier binaire.
use strict;
use warnings;
use File::Type;
my $file = '/path/to/file.ext';
my $ft = File::Type->new();
my $file_type = $ft->mime_type($file);
if ( $file_type eq 'application/octet-stream' ) {
# possibly a text file
}
elsif ( $file_type eq 'application/zip' ) {
# file is a zip archive
}
+1, mais vous devriez remplacer My $ file_type = fichier :: type-> mime_type ($ fichier); code> par
par
my $ file_type = $ ft-> mime_type ($ fichier); Code>
Fichier :: Type Code> fonctionne ici, mais en général un joli travail de merde comparé à < Code> Fichier :: libmagique code> .
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 code>. Merci.
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
fileparse code> 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 :)
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"; }
Peut-être un peu de retard mais il pourrait être utilisé comme une référence alternative: 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 code> comme gzip comprimé. p> p>
Ê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 code>) 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.