PB avec test de zero -z $file

Le
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";} else {print "non vide";}
if (-z $pcgg) {print "pcgg vide";} else {print "non vide";}

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

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

Merci d'avance pour votre aide.

Bien cordialement.

Gérard Breiner
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Kevin
Le #33730
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$/";
}
Jacques Caron
Le #33729
Salut,

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

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/

Gérard Breiner
Le #33728
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"
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$/";
}
Gérard Breiner
Le #33235
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"
Salut,

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

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/



Kevin
Le #33234
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 :)

Jacques Caron
Le #33233
Salut,

On Fri, 18 Nov 2005 18:27:54 +0100, 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.


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/

gbreiner
Le #33226
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"
Salut,

On Fri, 18 Nov 2005 18:27:54 +0100, 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.


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/



Publicité
Poster une réponse
Anonyme