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

Fonction Dir et attributs

27 réponses
Avatar
Mersenne
Bonjour.

La documentation de Word 2002 sur la fonction Dir et son second argument ne
me semble pas claire.

Le second argument est, disons, un nombre entier traité comme champ de bits.

Voici ce que dit la documentation pour commencer :

" Dir, fonction

Renvoie une valeur de type String représentant le nom d'un fichier, d'un
répertoire ou d'un dossier correspondant à une chaîne de recherche, à un
attribut de fichier ou au nom de volume d'un lecteur.

Syntaxe

Dir[(pathname[, attributes])] "

Que faut-il entendre exactement par " correspondant à un attribut de
fichiers " ? Je crois comprendre cela comme suit : seuls seront retenus les
objets (fichiers ou dossiers) qui auront au moins les attributs impliqués
par le second paramètre, sans exclure les objets (fichiers ou dossiers) qui
auraient en plus certains autres attributs.

Exemple : la valeur vbNormal, qui est la valeur nulle, implique aucun
attribut, donc si Dir a cette valeur pour second argument, elle retiendra
tous les fichiers correspondant au premier argument, quels que soient les
systèmes d'attributs de ces fichiers.

Si on peut confirmer ou infirmer, merci d'avance.

Je vais maintenant donner un exemple de code qui me semble produire des
résultats inexplicables, quelle que soit la façon dont Dir est censée
procéder.

Avant de donner cet exemple de code et son résultat, je copie ce que la
documentation indique sur la façon de désigner les attributs :

Constante Valeur Description
vbNormal 0 (Par défaut) Spécifie les fichiers sans
attributs.
vbReadOnly 1 Spécifie les fichiers
accessibles en lecture seule ainsi que les fichiers sans attributs.
vbHidden 2 Spécifie les fichiers
cachés ainsi que les fichiers sans attributs.
vbSystem 4 Spécifie les fichiers
système ainsi que les fichiers sans attributs. Non disponible sur le
Macintosh.
vbVolume 8 Spécifie un nom de volume ;
si un autre attribut est spécifié, la constante vbVolume est ignorée. Non
disponible sur Macintosh.
vbDirectory 16 Spécifie les dossiers ainsi
que les fichiers sans attributs.
vbAlias 64 Le nom du fichier
spécifié est un alias. Disponible uniquement sur le Macintosh.

Voici maintenant un code que j'ai écrit pour tester cela :

If Dir("C:\FichierPourTesterAttributs.txt", vbNormal) <> "" Then
MsgBox "Le fichier existe déjà."
Else
MsgBox "Le fichier n'existe pas."
End If


(Remarque : la chaîne de caractères qui forme le premier argument ne finit
pas par le caractère "\". Mes essais m'ont fait conclure que, dans ce cas,
le fichier ou dossier cherché par Dir est le fichier ou dossier qui a pour
nom cette chaîne de caractères, et non un élément de ce fichier ou dossier.
L'exemple qui suit montre que c'est vrai au moins dans un cas...)


Le fichier en question dans la macro existe.
Si, avant la macro, je coche les attributs "Lecture seule" et "Archive" mais
pas l'attribut "Fichier caché", le MsgBox dit qu'il existe.
Si je coche les trois attributs "Lecture seule", "Fichier caché" et
"Archive", le MsgBox dit qu'il n'existe pas.

Je ne vois pas quelle est la règle qui peut faire attendre ce résultat.

Autres essais :

1° le fichier a pour seul attribut "lecture seule" : la macro le trouve.

2° le fichier a pour seul attribut "fichier caché" : la macro ne le trouve
pas.

Quelqu'un peut-il m'expliquer ce résultat? Merci d'avance.

10 réponses

1 2 3
Avatar
Geo
En cherchant sur le web, j'ai trouvé aussi ceci qui donne une autre
approche du paramètre :
If Dir (FileExist, vbNormal Or vbReadOnly Or vbHidden Or vbArchives =
"" Then
Call MsgBox("Ce fichier n'existe pas!")
Else
'Il existe,
End If

Et il y a les méthodes plus directes du genre Open ou save avec un
gestion d'erreur appropriée.

--
A+
Avatar
bayosky
salut,

En fait, beaucoup de fichiers possède au moins deux attributs
( genre Archive+caché) il faut mieux accumuler les infos pour tout
traiter

En reprenant la procédure proposée cela donnerait un truc du type
balayage2bis:

HB

Sub balayage2bis()

Dim fso As Object, dossier As Object, fichier As Object, Message

Set fso = CreateObject("scripting.filesystemobject")

Set dossier = fso.getfolder("c:copie")
For Each fichier In dossier.Files

' à partir de là je préfère un truc du type

Message=""

If fichier.Attributes And 2 Then
Message= Message & " Caché "
Endif
If fichier.Attributes And 1 Then
Message= Message &" Lecture seule "
Endif

' etc ... j'ai la flemme :o(

If fichier.Attributes And 16 Then
MsgBox "Dossier "
ElseIf fichier.Attributes And 32 Then
MsgBox "Archive"
ElseIf fichier.Attributes And 64 Then
MsgBox "Alias"
ElseIf fichier.Attributes And 4 Then
MsgBox "Système"
ElseIf fichier.Attributes And 8 Then
MsgBox "Volume"
ElseIf fichier.Attributes And 128 Then
MsgBox "Compressé"
Endif

If Message ="" then
Message = "Aucun attribut "
End If

Message = fichier.name & " : " & Message
Next

End Sub

Avatar
Mersenne
"Geo" a écrit dans le message de news:

En cherchant sur le web, j'ai trouvé aussi ceci qui donne une autre
approche du paramètre :
If Dir (FileExist, vbNormal Or vbReadOnly Or vbHidden Or vbArchives = ""
Then
Call MsgBox("Ce fichier n'existe pas!")
Else
'Il existe,
End If


Merci Geo, mais j'ai des objections.

Tout d'abord, un détail : c'est vbArchive, sans s. Cette constante vaut 32.
Au fait, pourquoi la documentation de Dir dans Word 2002 ne parle-t-elle pas
de cette constante ?

Je me demande maintenant si celui qui a rédigé la macro ci-dessus comprenait
bien ce qu'elle signifiait.
L'avez-vous testée ? Je l'ai fait sur un fichier sans aucun attribut et,
conformément à mon attente, le fichier n'a pas été trouvé.

Voilà comment je comprends le fonctionnement du second paramètre de Dir (en
théorie, parce que, comme je l'ai dit, il me semble qu'il y a un bug, au
moins en ce qui concerne les fichiers cachés).

Le second paramètre de Dir est un nombre entier (non signé) traité comme un
"champ de bits".
Si l'écriture binaire de ce nombre est, par exemple, 101, il "implique" les
deux valeurs 1 (vbReadOnly) et 4 (vbSystem).
Si je comprends bien (mais je peux me tromper, car la documentation ne dit
pas cela clairement), la fonction Dir retient, et retient uniquement, les
fichiers qui ont au moins les attributs impliqués par le second paramètre
(qu'ils possèdent ou ne possèdent pas les autres attributs).

Le Or utilisé dans la macro ci-dessus renvoie le nombre binaire qui comporte
un chiffre 1 à chaque endroit où un au moins des opérandes en comporte un,
et qui comporte des zéros partout ailleurs.
Donc (puisque vbNormal, égal à zéro, n'a des 1 nulle part) vbNormal Or
vbReadOnly revient à vbReadOnly, comme le confirme la macro suivante :

MsgBox "vbNormal Or vbReadOnly vaut " & (vbNormal Or vbReadOnly)

(elle affiche 1, qui est la valeur de vbReadOnly).

La présence de vbNormal dans la macro que vous avez trouvée sur le Web est
donc inutile et me donne l'impression que son auteur ne comprenait pas le
sens du "Or" appliqué à des nombres.

Le second argument de Dir dans la macro, qui revient à vbReadOnly Or
vbHidden Or vbArchives , a pour effet (si je comprends bien) que la fonction
ne retient que les fichiers ou dossiers ayant au moins les attributs
vbReadOnly, vbHidden et vbArchives.

Cela explique que, quand je l'ai testée, un fichier sans aucun attribut n'a
pas été trouvé.

Je dois dire que je suce un peu tout ça de mon pouce, parce que

1° la documentation ne me semble pas vraiment explicite (elle ajoute même
des "ou les fichiers sans attributs" qui me paraissent incompréhensibles)

2° comme je l'ai dit, je crois qu'il y a un bug en ce qui concerne les
fichiers cachés.

Je serai heureux si on veut bien confirmer ou infirmer.

Mersenne.

Avatar
Mersenne
Désolé, mon précédent message est un tissu d'idioties.
Le fichier sans attributs est bel et bien trouvé par la macro de Geo.

Ceci dit, la valeur du second paramètre dans la macro indiquée par Geo est

vbNormal Or vbReadOnly Or vbHidden Or vbArchives, c'est-à-dire 35 (1 + 2 +
32), confirmé par MsgBox :

vbNormal Or vbReadOnly Or vbHidden Or vbArchives .

(Donc, ce que je disais de l'opérateur Or dans mon précédent message semble
confirmé.)

Quelqu'un peut-il expliquer comment Dir() traite le paramètre 35 ( = 1 + 2 +
32) pour en conclure que tous les fichiers ou dossiers sont bons ? (C'est en
tout cas ce qu'elle semble faire si j'en juge par mes essais).

Merci d'avance.

Mersenne.
Avatar
Mersenne
Merci Bayosky.

Je me servirai peut-être de la méthode que vous indiquez, mais j'aimerais
comprendre comment Dir() traite exactement son second paramètre.

Si le second paramètre est vbNormal (c'est-à-dire 0), elle trouve un fichier
qui a pour seul attribut "lecture seule" mais ne trouve pas un fichier qui a
pour seul attribut "fichier caché".

Puisqu'il y a une valeur vbHidden, il me semble peu probable que cette
valeur soit traitée autrement que les autres.

Donc, il me semble qu'il y a là un bug.

Ensuite, j'aimerais savoir ce que fait exactement Dir de son second
paramètre. (Dans un précédent message, j'avais fait une hypothèse qui est
certainement fausse.) Comment se fait-il que quand ce second paramètre est
un nombre qui contient beaucoup de 1, beaucoup de fichiers soient trouvés ?
(L'explication est sans doute que Dir applique un Or logique, en tenant
compte que, conformément à la documentation, vbReadOnly signifie "en lecture
seule ou sans attributs".)

Et si on veut que seuls les fichiers ayant à la fois les trois attributs
(lecture seule =1, caché = 2 et archive = 32) soient retenus, est-ce
possible en indiquant seulement le bon paramètre ou faut-il utiliser
Getattributes) ?

On commence peut-être à me trouver ennuyeux.

Je résume :

1° on dirait qu'il y a un bug en ce qui concerne les fichiers cachés;

2° la documentation ne dit pas clairement comment Dir() traite son second
paramètre.

Mersenne.
Avatar
bayosky
Dans le message ,
Merci Bayosky.

Et si on veut que seuls les fichiers ayant à la fois les trois
attributs (lecture seule =1, caché = 2 et archive = 32) soient
retenus, est-ce possible en indiquant seulement le bon paramètre ou
faut-il utiliser Getattributes) ?


salut,

pour ce cas là ce sera donc
If fichier.Attributs = 35 then ...

(1+2+325 )

HB

Avatar
Mersenne
"bayosky" a écrit dans le message de news:

Dans le message ,
Merci Bayosky.

Et si on veut que seuls les fichiers ayant à la fois les trois
attributs (lecture seule =1, caché = 2 et archive = 32) soient
retenus, est-ce possible en indiquant seulement le bon paramètre ou
faut-il utiliser Getattributes) ?


salut,

pour ce cas là ce sera donc
If fichier.Attributs = 35 then ...

(1+2+325 )



Merci.

Je comprends comment fonctionne GetAttr et je pourrais m'en servir.
Ce que je ne comprends pas bien, c'est la façon dont Dir interprète son
second paramètre.
Par exemple, si on lui donne 35 comme second paramètre, elle accepte tous
les fichiers. Comment se formule la règle ?

Merci à qui peut donner une réponse précise.

Mersenne.


Avatar
Mersenne
Bonjour tout le monde.

Je soumets ceci à votre sagacité.

La documentation dit que le second paramètre de Dir() indique des attributs
à "inclure".
Cela suggère que si le second paramètre est par exemple vbReadOnly +
vbArchive, la fonction va trouver tous les fichiers correspondant à
vbReadOnly (c'est-à-dire, d'après la documentation, tous les fichiers en
lecture seule mais aussi tous les fichiers sans attributs) et tous les
fichiers correspondant à vbArchive (bizarrement, la documentation de Dir
dans Word 2002 ne parle pas de vbArchive, mais je suppose que cela désigne
les fichiers ayant l'attribut Archive et aussi, par analogie avec les autres
cas, les fichiers sans attributs).
Il reste un problème quand le second paramètre est vbNormal ( = 0). Là, je
crois que nous sommes tous d'accord pour dire qu'il y a un bug. (Voir les
exemples de mon premier message.)

Mersenne.
Avatar
Clément Marcotte
Bonjour,

Il reste un problème quand le second paramètre est vbNormal ( = 0). Là, je
crois que nous sommes tous d'accord pour dire qu'il y a un bug.


Ça c'est vite dit. La fonction Dir() date des tous débuts de BASIC, avec
MS-DOS. Sauf que depuis ce temps-là, le système d'exploitation a beaucoup
évolué. Par exemple, (là c'est du vécu), un appel direct à L'API Windows
dans VB6, pour, justement, lister des fichiers dans un Treeview retourne les
fichiers dans le désordre avec Windows 98, alors que la même routine dans le
même programme, mais dans Windows XP retourne systématiquement les fichiers
en ordre alphabétique.

Avant de dire que DIR est buggué, il faudrait que cela retourne toujours la
même chose avec toutes les versions de Windows. Et ça, ce n'est pas garanti.

Avatar
Mersenne

Ça c'est vite dit. La fonction Dir() date des tous débuts de BASIC, avec
MS-DOS. Sauf que depuis ce temps-là, le système d'exploitation a beaucoup
évolué. Par exemple, (là c'est du vécu), un appel direct à L'API Windows
dans VB6, pour, justement, lister des fichiers dans un Treeview retourne
les fichiers dans le désordre avec Windows 98, alors que la même routine
dans le même programme, mais dans Windows XP retourne systématiquement les
fichiers en ordre alphabétique.

Avant de dire que DIR est buggué, il faudrait que cela retourne toujours
la même chose avec toutes les versions de Windows. Et ça, ce n'est pas
garanti.

Bonsoir Clément et tout le monde.


En tout cas, je crois que nous sommes tous d'accord pour dire que, sous
Windows XP (personne n'a la possibilité d'essayer sur une autre version de
Windows ?), Dir avec second argument vbNormal donne un résultat inexplicable
(comparer les résultats sur un fichier ayant pour seul attribut "fichier
caché" et sur un fichier ayant pour seul attribut "lecture seule").

Le problème, c'est que la documentation de Dir n'est pas très explicite.

Quelqu'un sait-il s'il est utile de signaler quelque part ce genre
d'anomalies, en vue d'une future mise à jour ?

Merci d'avance.

Mersenne.

1 2 3