Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

PB avec test de zero -z $file

7 réponses
Avatar
Gérard Breiner
Bonjour à toutes et tous,

J'ai un petit problème pour tester si un répertoire est vide.
Je sais que dans le programme ci-dessous $pcgg n'est pas vide alors que $val
l'est.
Je fais mon test sans filehandle et avec filehandle mais les deux cas
j'obtiens comme résultat que le répertoire est vide.
Je ne vois vraiment pas ou se situe mon erreur
$pcgg ="g:/Retrospect/pcgg/1-pcgg";
$val = "g:/Retrospect/dwin-g4-valette/1-dwin-g4-valette";
#test sans filehandle
if (-z $val) {print "val vide\n";} else {print "non vide\n";}
if (-z $pcgg) {print "pcgg vide\n";} else {print "non vide\n";}

#test sur un filehandle
opendir(FILE1, $val);
if( -z readdir(FILE1)) { print "val vide\n";}
else {print "val non vide\n";
}
close(FILE1);

opendir(FILE2, $pcgg);
if( -z readdir(FILE2)) { print "pcgg vide\n";}
else {print "pcgg non vide\n";
}
close(FILE2)

Merci d'avance pour votre aide.

Bien cordialement.

Gérard Breiner

7 réponses

Avatar
Kevin
Salut,

A défaut de mieux le code suivant fonctionne :)

pourquoi 2 dans le if? => parce qu'il y a tjs . et .. dans un
répertoire :p


my $dir="d1";

if(-d $dir && opendir(DIR, $dir) && scalar(map($_, readdir(DIR)))==2)
{
print "empty$/";
}
else
{
print "not empty or not a directory$/";
}
Avatar
Jacques Caron
Salut,

On Fri, 18 Nov 2005 15:42:22 +0100, Gérard Breiner
wrote:

J'ai un petit problème pour tester si un répertoire est vide.
Je sais que dans le programme ci-dessous $pcgg n'est pas vide alors que
$val l'est.
Je fais mon test sans filehandle et avec filehandle mais les deux cas
j'obtiens comme résultat que le répertoire est vide.
Je ne vois vraiment pas ou se situe mon erreur


Euh... Où est-il dit que -z sait tester si un répertoire est vide ou pas?
Il permet de tester la taille d'un fichier, et un répertoire n'étant pas
(vraiment) un fichier, il doit effectivement renvoyer des choses bizarres
(sur une machine Unix il répond toujours une chaîne vide, parce que le
"fichier" correspondant n'est jamais de taille 0, il y a toujours au moins
. et .. dedans, et il ne décroit jamais, en plus). Et le -z readdir ça va
tester la taille du premier fichier du répertoire.

La bonne solution est vraisemblablement quelque chose comme:

opendir my $dir,$dirname;
$size = grep {$_ !~ /^(.|..)$/} readdir $dir;
closedir $dir;

Mais ça peut être plus subtil que ça sous Windows, éventuellement.

Jacques.
--
Oxado http://www.oxado.com/

Avatar
Gérard Breiner
Oui, ce code fonctionne très bien. Cependant, vous serai-t'il possible de
m'apporter quelques précisions sur le fonctionnement des fonctions scalar et
map ? (le 2 pour . et .. m'intrigue);
En tout cas merci infiniment Kevin.

Gerard
"Kevin" a écrit dans le message de news:

Salut,

A défaut de mieux le code suivant fonctionne :)

pourquoi 2 dans le if? => parce qu'il y a tjs . et .. dans un
répertoire :p


my $dir="d1";

if(-d $dir && opendir(DIR, $dir) && scalar(map($_, readdir(DIR)))==2)
{
print "empty$/";
}
else
{
print "not empty or not a directory$/";
}
Avatar
Gérard Breiner
Effectivement -z s'applique à un fichier. Mon erreur vient du fait que je
croyais qu'un répertoire était vu comme une sorte de fichier bien que ses
attributs ne soient pas tout à fait les mêmes.
Je vous remercie aussi pour cette solution et je vais l'essayer.
Gérard

"Jacques Caron" a écrit dans le message de news:

Salut,

On Fri, 18 Nov 2005 15:42:22 +0100, Gérard Breiner
wrote:

J'ai un petit problème pour tester si un répertoire est vide.
Je sais que dans le programme ci-dessous $pcgg n'est pas vide alors que
$val l'est.
Je fais mon test sans filehandle et avec filehandle mais les deux cas
j'obtiens comme résultat que le répertoire est vide.
Je ne vois vraiment pas ou se situe mon erreur


Euh... Où est-il dit que -z sait tester si un répertoire est vide ou pas?
Il permet de tester la taille d'un fichier, et un répertoire n'étant pas
(vraiment) un fichier, il doit effectivement renvoyer des choses bizarres
(sur une machine Unix il répond toujours une chaîne vide, parce que le
"fichier" correspondant n'est jamais de taille 0, il y a toujours au moins
. et .. dedans, et il ne décroit jamais, en plus). Et le -z readdir ça va
tester la taille du premier fichier du répertoire.

La bonne solution est vraisemblablement quelque chose comme:

opendir my $dir,$dirname;
$size = grep {$_ !~ /^(.|..)$/} readdir $dir;
closedir $dir;

Mais ça peut être plus subtil que ça sous Windows, éventuellement.

Jacques.
--
Oxado http://www.oxado.com/



Avatar
Kevin
map($_, readdir(DIR)); retourne un array avec chaque fichier dans un
élément du tableau

et scalar nous permet d'accéder au contexte scalaire de l'array
renvoyé par map (comme chacun le sait @array dans un contexte scalaire
renvoie le nombre d'éléments)

quant au 2, dans un répertoire (même vide) il y a toujours les
répertoires .(répertoire courant) et .. (répertoire parent), que ce
soit sous windows, linux, unix, ...

windows:

dir
18/11/2005 19:36 <REP> .

18/11/2005 19:36 <REP> ..


linux:

:~$ ls -la
total 35260
drwxrwx--- 27 kevin webusers 4096 2005-11-15 21:22 .
drwxrwsr-x 18 root webusers 4096 2005-11-17 00:18 ..


donc quand on tombe sur un répertoire qui contient que deux
éléments, on peut dire qu'il est vide :)

Avatar
Jacques Caron
Salut,

On Fri, 18 Nov 2005 18:27:54 +0100, Gérard Breiner
wrote:

Effectivement -z s'applique à un fichier. Mon erreur vient du fait que
je croyais qu'un répertoire était vu comme une sorte de fichier bien que
ses
attributs ne soient pas tout à fait les mêmes.


Sous Unix, oui, un répertoire est une sorte de fichier, mais:
- il contient toujours au moins . et ..
- il a dans certaines implémentations une taille toujours multiple de la
taille du secteur
- en général, il ne réduit pas quand on efface des fichiers

Donc sous Unix un -z sur un directory est toujours faux, le "fichier"
correspondant étant toujours non vide.

Sous Windows (ce qui semble être ton cas) je ne sais pas trop...

Jacques.
--
Oxado http://www.oxado.com/

Avatar
gbreiner
Bonsoir,

Je suis sous windows, les répertoires contiennent aussi les "." et " .."."
Merci Jacques pour tes explications et solution que j'ai d'ailleurs adopté.
Gérard
"Jacques Caron" a écrit dans le message de news:

Salut,

On Fri, 18 Nov 2005 18:27:54 +0100, Gérard Breiner
wrote:

Effectivement -z s'applique à un fichier. Mon erreur vient du fait que
je croyais qu'un répertoire était vu comme une sorte de fichier bien que
ses
attributs ne soient pas tout à fait les mêmes.


Sous Unix, oui, un répertoire est une sorte de fichier, mais:
- il contient toujours au moins . et ..
- il a dans certaines implémentations une taille toujours multiple de la
taille du secteur
- en général, il ne réduit pas quand on efface des fichiers

Donc sous Unix un -z sur un directory est toujours faux, le "fichier"
correspondant étant toujours non vide.

Sous Windows (ce qui semble être ton cas) je ne sais pas trop...

Jacques.
--
Oxado http://www.oxado.com/