Page 1 sur 2
[R] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 12:45
par walkson
Bonjour,
Je cherche le moyen de distinguer un dossier ou un fichier sachant que Windows accepte ces 2 formes:
C:\Temp\aa.xls comme dossier et C:\Temp\aa.xls comme fichier
Ma recherche m'a donné FileFindNextFile() par @extended permettant de déterminer un dossier ou un fichier comme ceci:
Code : Tout sélectionner
$SearchDir = "C:\Temp\aa.xls"
$hsearch = FileFindFirstFile($SearchDir)
$search = FileFindNextFile($hsearch)
If @extended = 1 Then
MsgBox(0,"",$SearchDir & " est un dossier")
Else
MsgBox(0,"",$SearchDir & " est un fichier")
EndIf
Ma question est donc de savoir s'il existe une autre méthode plus simple si possible.
Merci de vos réponses
Re: [..] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 13:00
par jguinch
Code : Tout sélectionner
$SearchDir = "C:\Temp\aa.xls"
If StringInStr(FileGetAttrib($SearchDir), "D") Then
MsgBox(0,"",$SearchDir & " est un dossier")
Else
MsgBox(0,"",$SearchDir & " est un fichier")
EndIf

Re: [..] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 13:15
par walkson
Bonjour jguinch
En effet, c'est beaucoup plus simple et je suppose que StringInStr(FileGetAttrib($SearchDir), "A") me renvoie sur un fichier...
Merci.
Re: [..] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 13:38
par TomAijerrie
walkson a écrit :et je suppose que StringInStr(FileGetAttrib($SearchDir), "A") me renvoie sur un fichier...
Pas vraiment,
FileGetAttrib($SearchDir) renvoie une chaine de caractères avec
- un "D" si la recherche est un dossier
- un "A" si la recherche est une archive (Tous les fichiers ne sont pas archives et certains dossiers le sont)( presque tous sur mon DD)
- un "R" si le fichier/dossier sont en lecture seule
- un "S" si il s'agit d'un fichier système
- un "H" si le fichier/dossier est caché
etc.
Regarde la doc (F1) pour plus d'infos
Pour avoir un fichier utilise plutôt
Re: [..] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 13:43
par jguinch
Non, car attribut A = "Le fichier/dossier est prêt à être archivé".
Il faut tout simplement tester si FileGetAttrib contient D ou non.
Sinon, _WinAPI_FileExists retourne @extended = 1 si c'est un dossier
Edit : grillé par TomAijerrie.
Re: [..] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 15:58
par walkson
C'est justement en regardant l'aide que j'ai déduit que "A" pouvait correspondre aux fichiers: déduction fausse (et paf!)
Sinon j'ai regardé _WinAPI_FileExists (#include <WinAPIFiles.au3>) qui me renvoit la fonction
Code : Tout sélectionner
Func _WinAPI_FileExists($sFile)
If Not FileExists($sFile) Then Return 0
If _WinAPI_PathIsDirectory($sFile) Then Return SetExtended(1, 0)
Return 1
EndFunc ;==>_WinAPI_FileExists
J'ai donc regardé _WinAPI_PathIsDirectory($sFile) et impossible de le trouver ! J'ai bien _WinAPI_PathIsDirectoryEmpty($sPath) mais point de _WinAPI_PathIsDirectory($sFile) J'ai parcouru l'include et celles qui l'accompagnent, en recherche par Scite ou en lisant, rien, pas de fonction équivalente. Dois je changer mes lunettes ou y a t' il une autre explication ?
Re: [..] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 16:41
par mikell
#include <WinAPIFiles.au3>
renvoie à #include <WinAPIInternals.au3>
WinAPIEx Reference > Files & Devices Reference > Files Management > _WinAPI_PathIsDirectory
Retourne $FILE_ATTRIBUTE_DIRECTORY (guess what ?)
Pourquoi faire simple quand on peut faire compliqué ?
Re: [..] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 17:27
par walkson
Excuse moi Mikell mais je n'ai pas compris ta réponse.
Je cherche le contenu de la fonction _WinAPI_PathIsDirectory qui devrait se trouver dans #include "WinAPIFiles.au3" et que je ne trouve pas.
Je ne recherche pas la complexité mais de comprendre le fonctionnement (appel à une Dll ?). Tu me conseillais, il y a quelques temps, de lire les includes pour mieux comprendre, c'est ce que je fais.
sinon la réponse de jguinch me convient tout à fait et je devine, par le retour
_WinAPI_PathIsDirectory ($FILE_ATTRIBUTE_DIRECTORY) que cette fonction est identique à sa proposition mais je cherche à comprendre tout simplement
Edit: Tu as du modifier ta réponse pendant que j'écrivais. Cependant, je ne comprend tjs pas car je ne trouve pas _WinAPI_PathIsDirectory dans WinAPIInternals.au3 ou ailleurs...
Re: [..] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 17:32
par mikell
Hum quelle est ta version d'Autoit ?
Re: [..] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 17:56
par walkson
Je ne sais pas où on peut le trouver mais si c'est AutoIt3.exe, la version est 3.3.10.2
Sinon, si je fais
$repond = _WinAPI_PathIsDirectory($SearchDir)
MsgBox(0,"",$repond)
J'obtiens 16 correspondant à un dossier donc la fonction est là, mais où ?...
Re: [..] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 18:15
par jguinch
Attention, un include peut en cacher un autre
Lorsqu'on tu fais ton
#Include <WinAPIFiles.au3> il fait lui-même appel à d'autres includes, comme
WinAPIMisc.au3 (entre autres), qui lui-même fait appel
WinAPIInternals.au3 : c'est ce dernier qui contient la fonction

Re: [..] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 18:21
par mikell
J'avais zappé l'étape du milieu
Comme je visite beaucoup les includes je me suis fait un beau petit outil qui fait ce genre de recherche pour moi
L'automation peut avoir ses inconvénients....
Re: [..] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 19:31
par walkson
J'ai la réponse à mon problème: il faut que je change de lunettes
En effet, jguinch, la fonction est bien là où tu le dis. Désolé de vous déranger pour rien
Mikell, je ne veux pas te forcer la main, mais ton beau petit outil, honnêtement, il m’intéresse...
Merci à vous tous (et à votre patience...)
Re: [R] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 21:38
par mikell
Pas de problème
Mais le bazar n'étant pas prévu pour être diffusé il est brut de décoffrage et pas fignolé, en plus il m'a servi de brouillon pour comprendre les SendMesssage sur Edit ^^
Mode d'emploi sommaire :
Pour rechercher dans un include, tu sélectionnes qqe chose ou tu le colles dans l'input et tu fais F3 le nombre de fois qu'il faut
Pour savoir dans quel include se trouve qqe chose, bouton "fouiller dans les includes", puis tu colles dans l'input, bouton "vazi", ensuite select la ligne de listview qui t'intéresse et bouton "select zis one"
Absence de bug(s) non garantie
Have fun
Re: Re : [R] Distinguer dossier ou fichier
Posté : jeu. 11 sept. 2014 23:16
par Tlem
Bonsoir.
Sinon pour une recherche de fonction ou variables dans les includes, une recherche de texte brut à partir de Windows ou tout autre outil adapté amène aussi la réponse ...
Il existe d'ailleurs en AutoIt ce type d'outil (voir forum US). Il me semble qu'il s'appelle SearchMyFiles.
Recherche de fichiers dans le dossier C:\...\AutoIt3\Includes contenant le texte : Func _WinAPI_PathIsDirectory(
Envoyé depuis mon mobile en utilisant Tapatalk.
Re: [R] Distinguer dossier ou fichier
Posté : ven. 12 sept. 2014 14:23
par mikell
Thierry, il y a des tas de petits softs disponibles sur internet qui ont - à peu près - le même genre de fonctionnalités
Mais je voulais un outil dédié, simple facile et rapide
Re: [R] Distinguer dossier ou fichier
Posté : ven. 12 sept. 2014 14:36
par TommyDDR
Moi j'écris le nom de la fonction, un petit ctrl + alt + shift + i pour ajouter l'include et ctrl + j sur la fonction pour ouvrir le fichier la contenant.
Re: Re : [R] Distinguer dossier ou fichier
Posté : ven. 12 sept. 2014 19:38
par Tlem
@mikell
C'est bien ce que je dit au début du message : "ou tout autre outil adapté".
@TommyDDR
Bien, mais peut être pas encore suffisant pour certains. Peut être un script AutoIt qui a partir de SciTe4AutoIt permettrait avec une combinaison de touches d'afficher une fenêtre de saisie ou l'on rentre le nom de la fonction et le reste est automatique ...
Et pourquoi pas un truc qui lirait carrément la pensée, voir même ferait une prediction de recherche pour l'utilisateur ... ^^
Envoyé depuis mon mobile en utilisant Tapatalk.
Re: Re : [R] Distinguer dossier ou fichier
Posté : ven. 12 sept. 2014 21:38
par walkson
Tlem a écrit :Et pourquoi pas un truc qui lirait carrément la pensée
Je n'ose l'imaginer ! (lol)
@TommyDDR
Je ne veux pas mourir idiot donc j'ai essayé:
Code : Tout sélectionner
+> "Organize Includes" for AutoIt3 | Version 1.0.0.50 | © Th.Meger™ | 13.March.2010
!No udf path found : RegRead("HKCU\Software\AutoIt v3\Autoit", "Include")
>Exit code: 0 Time: 5.312
Par contre, le petit programme de Mikell marche à merveille
Re: [R] Distinguer dossier ou fichier
Posté : ven. 12 sept. 2014 21:46
par mikell
Bah, autant d'users autant de solutions diverses, chacun y allant de sa méthode personnelle ^^
Une liste - exhaustive ou pas - de ces méthodes ne présente alors qu'un intérêt très relatif
Le but d'un script Autoit c'est pas de réinventer la roue, c'est de produire un outil précis qui fait exactement ce qu'on veut sans fonctionnalités superflues
Et "un truc qui lirait carrément la pensée" c'est précisément ce que fait mon code (moyennant quand même 2 ou 3 clics) mais bien évidemment, c'est ma pensée à moi qu'il lit
Edit
Apparemment il lit aussi un peu celle de walkson
