[VB] Trouver un répertoire/fichier sur le disque ? facile ?

Trouver un répertoire/fichier sur le disque ? facile ? [VB] - Programmation

Marsh Posté le 17-05-2001 à 14:14:55    

Ayant le nom d'un fichier dans une variable, je cherche à ressortir son chemin sur le disque.
 
Je m'explique =>
nom du fichier ou répertoire: "My_file.doc"
chemin à trouver: C:\MyDocs\Word\My_file.doc"
 
Comment faire en VB ? :??:

Reply

Marsh Posté le 17-05-2001 à 14:14:55   

Reply

Marsh Posté le 17-05-2001 à 14:37:49    

Peut être peux tu faire cela en utilisant la fonction FindFirstFileEx de l'api Win32.
 
http://msdn.microsoft.com/library/ [...] o_24s8.htm

Reply

Marsh Posté le 17-05-2001 à 14:59:20    

Ca pourrait faire l'affaire mais j'ai trouvé ca qui parait plus simple mais ca ne fonctionne pas , pourquoi ? :cry:  
 
Function ShowFileAccessInfo(filespec)
  Dim fso, d, f, s
  Set fso = CreateObject("Scripting.FileSystemObject" )
  Set f = fso.GetFile(filespec)
  s = UCase(f.Path) & "<BR>"
  s = s & "Créé le: " & f.DateCreated & "<BR>"
  s = s & "Dernier accès le: " & f.DateLastAccessed & "<BR>"
  s = s & "Dernière modification le: " & f.DateLastModified
  ShowFileAccessInfo = s
End Function

Reply

Marsh Posté le 17-05-2001 à 15:10:20    

La méthode GetFile considère filespec comme étant soit un chemin absolu, soit un chemin relatif, pas un critère de recherche.

Reply

Marsh Posté le 17-05-2001 à 15:33:20    

En effet donc ca ne me convient pas car je ne connait pas le chemin (c'est ca que je cherche)
 
Concernant l'API ca ne convient pas non plus car il faut le chemin à l'origine aussi.
 
 :cry:  :cry:

Reply

Marsh Posté le 17-05-2001 à 16:32:41    

guru> Pour l'api j'ai mal vu car il y a "FindFirstFileEx" et "FindFirstFile" ce qui est différent.
Je vais essayer de voir avec ton lien.

Reply

Marsh Posté le 17-05-2001 à 16:49:51    

Non en fait ca ne convient pas car il faut donner le nom d'un répertoire et ensuite la fonction recherche si le fichier est dedans.
Moi je ne veux pas donner de nom de répertoire, juste le fichier. :hot:  
 
Quelqu'un a une idée ? :??:

Reply

Marsh Posté le 17-05-2001 à 16:59:22    

Sauf erreur dans la compréhension de la description de la fonction FindFirstFileEx, tu n'as pas a donner un répertoire de départ.

Reply

Marsh Posté le 17-05-2001 à 17:16:09    

il est dit>
 
"Pointer to a null-terminated string that specifies a valid directory or path and file name"
 
pour moi il faut donner le chemin ou un répertoire avec le nom du fichier  :??:

Reply

Marsh Posté le 17-05-2001 à 17:29:13    

as tu essayé ?
As tu mis directement ton nom de fichier ?
Car rien n'est dit sur le fait que le path ne peut reduit au nom de fichier ....


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 17-05-2001 à 17:29:13   

Reply

Marsh Posté le 17-05-2001 à 17:35:12    

J'avouerais que je n'ai pas essayé (car j'étais sur une autre solution non concluante) mais je vais le faire pour tester et je donnerais des nouvelles.

Reply

Marsh Posté le 17-05-2001 à 18:07:03    

J'ai peur qu'il faille bien donné un chemin.
la fonction recherche le fichier dans un répertoire (chemin) donné.
 
voila un code qui utilise la fonction (recherche le nombre d'occurrence d'un fichier dans un répertoire donné):
 
 
Option Explicit
'----------------------------------------
'------Déclarations propres aux API------
'----------------------------------------
'---Les constantes---
Private Const MAX_PATH = 260
Private Const INVALID_HANDLE_VALUE = -1
Private Const FILE_ATTRIBUTE_READONLY = &H1
Private Const FILE_ATTRIBUTE_HIDDEN = &H2
Private Const FILE_ATTRIBUTE_SYSTEM = &H4
Private Const FILE_ATTRIBUTE_DIRECTORY = &H10
Private Const FILE_ATTRIBUTE_ARCHIVE = &H20
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const FILE_ATTRIBUTE_TEMPORARY = &H100
Private Const FILE_ATTRIBUTE_COMPRESSED = &H800
 
'---Les API---
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" _
         (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" _
         (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
 
'---Les types---
Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type
 
Private Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
End Type
 
'----------------------------------------------
'------Déclarations propres à la fonction------
'----------------------------------------------
Private Type ListeFichier
    Fichiers() As WIN32_FIND_DATA
    Chemin() As String * MAX_PATH
    Nombre As Long
End Type
Private Sub Form_click()
' Alogtihme récursif
'---Déclaration des variables---
Dim ResultatRecherche As ListeFichier
Dim NombreOccurence As Long
Dim i
'---Recherche de tous les fichiers *.frm sur le lecteur D:\---
NombreOccurence = Rechercher("D:\", "*.frm", ResultatRecherche)
' Toutes les informations de la recherche sont dans la variables ResultatRecherche
MsgBox NombreOccurence & " ont été trouvées (ou a été trouvé)" & Chr(13) & _
       "Le premier fichier trouvé est : " & Trim$(ResultatRecherche.Chemin(1)) & _
       Trim$(ResultatRecherche.Fichiers(1).cFileName)
End Sub
 
'--------------------------------------------------------
'---La fonction Rechercher : ---
'--- Cette fonction recherche tous les fichiers dans ---
'--- le répertoire spécifié et ses sous-repertoires ---
'--- Elle retourne le nombre d'occurences trouvées ---
'--------------------------------------------------------
Private Function Rechercher(Chemin As String, FichierR As String, _
        ResultatRecherche As ListeFichier) As Long
'---Déclaration des variables---
Dim lpFindFileData As WIN32_FIND_DATA
Dim hFindFile As Long
Dim lgRep As Long
Dim CheminRep As String
'---Recherche tous les fichiers demandés dans le répertoire Chemin---
hFindFile = FindFirstFile(Chemin & FichierR, lpFindFileData)
If hFindFile <> INVALID_HANDLE_VALUE Then
    Do
        ' Mémorise
        ResultatRecherche.Nombre = ResultatRecherche.Nombre + 1
        ReDim Preserve ResultatRecherche.Chemin(1 To ResultatRecherche.Nombre)
        ReDim Preserve ResultatRecherche.Fichiers(1 To ResultatRecherche.Nombre)
        ResultatRecherche.Chemin(ResultatRecherche.Nombre) = Chemin
        ResultatRecherche.Fichiers(ResultatRecherche.Nombre) = lpFindFileData
        ' Initialise lpFindFileData (Variable texte uniquement)
        lpFindFileData.cAlternate = String$(14, 0)
        lpFindFileData.cFileName = String$(MAX_PATH, 0)
    Loop Until FindNextFile(hFindFile, lpFindFileData) = 0
End If
FindClose hFindFile
'---Recherche dans les sous-répertoires---
hFindFile = FindFirstFile(Chemin & "*.*", lpFindFileData)
If (hFindFile <> INVALID_HANDLE_VALUE) Then
    Do
        ' Si c'est un répertoire on continu le recherche
        If (lpFindFileData.dwFileAttributes And _
            FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Then
            ' Extraction du nom du répertoire
            CheminRep = Mid$(lpFindFileData.cFileName, 1, _
                        InStr(1, lpFindFileData.cFileName, Chr$(0)) - 1)
            ' Attention dans les sous-répertoire aux
            ' répertoires . et .. (Retour répertoire parent)
            If (CheminRep <> "." ) And (CheminRep <> ".." ) Then
                CheminRep = Chemin & CheminRep & "\"
                Rechercher = Rechercher(CheminRep, FichierR, ResultatRecherche)
            End If
        End If
    Loop Until FindNextFile(hFindFile, lpFindFileData) = 0
End If
FindClose hFindFile
'---Retourne le nombre d'occurrences trouvées---
Rechercher = ResultatRecherche.Nombre
End Function
 
 
 
 
J'ai fait quelques tests et ca ne fonctionne pas en donnant un fichier tout court  :cry:  
a moins que je me sois trompé ?  :??:  :(

Reply

Marsh Posté le 17-05-2001 à 18:15:15    

Heu des la premiere lecture j'ai la nette impression qu'il n'y a aucun probleme pour toi tu n'as qu'a indiquer c:\ et ce programme te permet de le trouver partout sur le lecteur c: meme les sous repertoires non ?
cf ---Recherche dans les sous-répertoires---
 
Je crois que ce programme repond a ta question.


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 17-05-2001 à 18:21:53    

le problème vient que le fichier peut se trouver sur un autre lecteur (d: e: f: ...).
Pour être plus clair, lors d'une installation d'un programme l'utilisateur peut placer son fichier ou il veut sur son disque (pas forcement dans la partition c:).
J'aimerais donc récupérer le chemin du fichier pour savoir ou il est installé. :(  
Donc je voudrais que le prog cherche dans tout le disque (sans donner de lecteur) :cry:

Reply

Marsh Posté le 17-05-2001 à 18:22:24    

y'a le  :) qui devait pas être la

Reply

Marsh Posté le 17-05-2001 à 18:28:47    

Heu ben avec guru on se dit qu'il suffit de boucler sur toutes les lettres de l'alphabet et puis c tout ... tu peux enlever A: B: ... le mieux c de commencer par C puis d'executer la boucle ...


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 17-05-2001 à 18:35:43    

:ouch: je pense que c'est la solution limite mais le seule que je vois aussi pour l'instant.
 
Pourquoi la fonction findfile("MyFile" ) existe pas  :gun:  :hot:  
 
 :sweat:

Reply

Marsh Posté le 18-05-2001 à 12:17:40    

guru, nabab>
 
Pour info, j'ai trouvé mon bonheur:
 
Le problème était à l'origine l'activation d'un répertoire virtuel.
Pour l'activer, il fallait connaitre le chemin où le client a installé ses fichiers (n'importe ou sur le disque dur).
 
Voila ma solution:
 
Dim oPath
Set oPath = CreateObject("Scripting.FileSystemObject" )
oPath = base.GetAbsolutePathName("" )
Set base = Nothing
MsgBox oPath
 
Ce .exe est installé dans le même répertoire que les autres fichiers.
le prog ressort le chemin complet vers le répertoire courant du prog et donc le chemin complet vers les fichiers installés.
 
 :bounce:

Reply

Marsh Posté le 18-05-2001 à 12:21:53    

Argh elle m'avait échappé cette méthode... Mais je viens de faire un test... elle te retourne le chemin complet mais ne te permet pas de trouver un fichier. Je pensais que tu voulais écrire quelque chose du genre findfile

 

[edit]--Message édité par Guru--[/edit]

Reply

Marsh Posté le 18-05-2001 à 12:27:59    

Ok vortex mais moi je me debattais plutot vers un find file et non pas un get path du exe du programme ....
 
Donc en fait il y a deux choses dans ce topic c un topic 2 en 1 parce que le forum le vaut bien ....


---------------
Ce qui vaut la peine d'être fait vaut la peine d'être bien fait
Reply

Marsh Posté le 18-05-2001 à 13:47:28    

guru, nabab>
 
Résumé de l'étude :
 
En fait à l'origine, c'était de trouver le chemin d'un fichier sur le disque lors de l'installation d'un prog (sachant qu'on ne sait pas où le client l'a mis).
 
un FindFile aurait permis de trouver un fichier sur le disque et par conséquent de connaitre son chemin en même temps.
Le problème rencontré est que pour rechercher un fichier, il fallait avoir une base de départ (c: , d: , etc ...) mais je ne suis pas sensé connaitre les partitions du disque.
 
Donc je suis reparti une solution donnant directement le chemin sans rechercher le fichier.
En détournant la fonction GetAbsolutePathName, celle ci me donne le chemin du programme d'où a été lancé la fonction.
Si ce programme est copié au même endroit que les autres fichiers clients, en le lancant je sais de suite ou ceux-ci ont été installés.
 
J'avoue je suis pas très clair dans mes explications  :D mais thank's a lot pour votre aide  :jap:  :jap:  
 :hello:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed