Détecter répertoire vide avec Perl
Ce qui est une manière simple de tester si un dossier est vide en perl? -s,- z ne sont pas de travail.
Exemple:
#Ensure Apps directory exists on the test PC.
if ( ! -s $gAppsDir )
{
die "\n$gAppsDir is not accessible or does not exist.\n";
}
#Ensure Apps directory exists on the test PC.
if ( ! -z $gAppsDir )
{
die "\n$gAppsDir is not accessible or does not exist.\n";
}
Ces ci-dessus, ne fonctionnent pas correctement pour me dire que le dossier est vide. Merci!
Merci à tous! J'ai fini par utiliser:
sub is_folder_empty { my $dirname = shift; opendir(my $dh, $dirname) or die "Not a directory";
return scalar(grep { $_ ne "." && $_ ne ".." } readdir($dh)) == 0; }
OriginalL'auteur Christopher Peterson | 2010-12-20
Vous devez vous connecter pour publier un commentaire.
Un peu détaillées pour plus de clarté, mais:
Alors vous pouvez faire:
or die "$dirname: $!"
Vous semblez confondre la "clarté" et la "brièveté" de. Aussi,
touch dir/....
imbéciles de votre expression régulière.La clarté et la concision est bon. Cette solution permet de lire tous les noms de fichier dans le répertoire, alors qu'au plus trois entrées sont nécessaires ('.' et '..' probablement apparaître en premier, et le nom suivant indique que le répertoire n'est pas vide. La fixation de la défaites de clarté, bien que.
Ne pas le répertoire de manipuler être fermé?
closedir($dh)
perl va fermer le descripteur de fichier une fois
$dh
est hors de portée, c'est à dire quandis_folder_empty
retourne.OriginalL'auteur Brad Fitzpatrick
À l'aide de
grep { ! /^[.][.]?\z/} readdir $dir_h
peut être problématique pour la performance dans le cas où la vérification est effectuée plusieurs fois, et à certains répertoires peuvent avoir de nombreux fichiers.Il serait préférable de court-circuit entre le moment où une entrée de répertoire autre que
.
ou..
est trouvé.Sur Windows XP avec ActiveState
perl
5.10.1, ce qui semble être deux fois plus rapide que lagrep
approche sur mon$HOME
avec 100 entrées:défini List::Util::première { $_ !~ /^[.][.]?\z/ } readdir $h; l'inconvénient de cette solution est que l'on va lire l'ensemble des entrées du répertoire à la liste de la première. Cela peut être long pour les répertoires avec de nombreux membres.
OriginalL'auteur Sinan Ünür
Ou sans grepping ou des expressions régulières - ce qui exclut toute possibilité d'étranges noms de fichiers accidentellement obtenir bien que. Plus légèrement plus rapide est de mes tests.
Assez simple. Si vous obtenez trois réponses valides à partir d'un appel à readdir, alors vous savez il doit y avoir un fichier. Quel que soit le nom que le fichier a peut-être - ou l'ordre dans lequel les fichiers sont en cours de traitement. Aurait préféré quelque chose appelé "is_dir_used' que personnellement je n'aime pas le double négatif nom de la fonction et de la valeur de retour.
non, les tests pour les noms d'ignorer sont nécessaires. Pas tous les systèmes de fichiers ont un .. dans chaque répertoire, par exemple.
N'est-ce pas le
..
entrée d'une propriété de l'OS et non pas du système de fichiers? Ceux qui n'en ont pas?Une norme ISO est conforme ou compatible OS, doivent prendre en charge le '.' et '..' pour tout le montage du système de fichiers, et qui couvre à peu près tous les OS modernes, il est. J'ai vu et utilisé des systèmes qui ne prennent pas en charge ces - peut-être 25 ans, et aucun de ces systèmes de prise en charge Perl - de sorte que cette solution devrait être OK aujourd'hui.
OriginalL'auteur Jim Black
Il est également
File::List
sur le cpan. C'est exagéré ici, mais peut être pratique pour un peu plus complexe demandes aime bien tester si un répertoire est vide avec le sens qu'il contient uniquement les répertoires vides (c'est à dire: pas de fichiers).OriginalL'auteur kriss
/\w/
.OriginalL'auteur user1424034
*
. Par exemple les fichiers qui commencent par un point.OriginalL'auteur Menaka Sankar
Crédit à DevShed
Modifier
Pour inclure les fichiers cachés:
Lisez les commentaires car il y a eu de bons points. Malgré les points négatifs de cette réponse est reçue, elle est toujours correcte.
Je ne pense pas que c'est vrai. Je pense qu'il va s'arrêter au premier fichier trouvé, comme mentionné dans le forum, il est semblable à
-e
et équivalent à l'appel de w/oscalar
, les deux vont s'arrêter au premier fichier trouvé.never use glob in scalar context unless you really know what you are doing
à cet égard, il est parfaitement sûr. Ne pas faire quelque chose pour le bien de ne pas le faire est de mauvais conseils.essayez-la. le suivant va imprimer le Fichier Existe deux fois, pas trois fois:
mkdir directory; touch directory/a; touch directory/b; perl -we'for(1..3){if (scalar <directory/*>) {print qq|File Exists\n|}}'
une bonne façon de le faire serait
if (()=<directory/*>)
mais souffre encore le défaut de ne pas l'avoir remarqué comme les fichiers du répertoire/.fooysth: c'est vrai et je ne l'ai jamais nié. Je suis d'accord aussi, vous devez savoir ce que vous faites, mais c'est un parfait moyen valable pour tester si un répertoire est vide (il ne vérifie pas les fichiers cachés comme vous l'avez mentionné). - votre exemple est pour une boucle, mais si vous n'avez
$x=<directory/*>;$y=<directory/*>;
puis$x
et$y
seraient tous les deux la même chose, la poignée est rappelé, dans le cas contraire (dans une boucle) la poignée est laissé ouvert et récupère la prochaine chose, donc au lieu defor
de son mieux pour utiliserwhile
- une fin de fichier sera atteint.OriginalL'auteur vol7ron