[Access 07] Recherche fichier

Signaler
Messages postés
7
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
15 octobre 2008
-
Messages postés
1229
Date d'inscription
vendredi 16 novembre 2007
Statut
Membre
Dernière intervention
16 juin 2009
-
Bonjour a tous,

Voila j'ai une base donnee avec dans un champ mon nom de fichier partiel. Il faudrait que je recherche ce fichier dans un dossier connu pour ensuite inscrire dans ma table le chemin complet (en vue d'une ouverture depuis un formulaire)

L'insertion dans la table je verrai ca apres pour le moment il faut deja que je reussisse a afficher mon chemin suite a la recherche.

Pour ca j'ai ce code mais je n'arrive pas a recuperer mon chemin:

-Dans un module:


<hr />
Option Compare Database


Private Declare Function SearchTreeForFile _
Lib "imagehlp" (ByVal RootPath As String, _
ByVal InputPathName As String, _
ByVal OutputPathBuffer As String) As Long
 
Sub scan(ByVal dossier As Folder, ByVal aTrouver As String)
Dim temp As String
   
    For Each fichier In dossier.Files
        If InStr(fichier.Name, aTrouver) > 0 Then         
        Exit Sub 'quitte ensuite si trouve
    End If
    Next 
        For Each sousdossier In dossier.SubFolders
        Call scan(sousdossier, aTrouver)
    Next
End Sub


<hr />

-Dans ma form:
<hr />Private Sub Command7_Click()
Dim fso As FileSystemObject, dossier As Folder, sousdossier As Folder, fichier As File

Set fso = New FileSystemObject
Set dossier = fso.GetFolder("O:\New OPG Folder\PROJECT RAINBOW_OPG\Technical Data\CBMI")
scan dossier, "LIC-640-N31-101-B"

End Sub

<hr />
Merci d'avance pour votre aide!

7 réponses

Messages postés
1229
Date d'inscription
vendredi 16 novembre 2007
Statut
Membre
Dernière intervention
16 juin 2009
1
Salut,

Pourquoi tu n'utilises pas une fonction api???

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


'----------------------------------------------
'------------Variables globales----------------
'----------------------------------------------
Dim rsFic               As ADODB.Recordset
Dim Repertoire          As String
Dim FichiersRecherchés  As String


'****************************************************************
' Initialisation du recordset
'****************************************************************
Private Sub init_Recordset()
    Set rsFic = New ADODB.Recordset
    rsFic.CursorLocation = adUseClient
    rsFic.CursorType = adOpenDynamic
   
    '-- Creation de champ pour la recherche sur les versions precedentes
    rsFic.Fields.Append "Nom", adVarChar, 50
    rsFic.Fields.Append "Chemin", adVarChar, 255
    rsFic.Open
End Sub


'****************************************************************
' Configuration pour le lancement de la recherche
'****************************************************************
Sub LancerLaRecherche_API()
    ' Alogtihme récursif
    '---Déclaration des variables---
    Dim ResultatRecherche As ListeFichier
    Dim NombreOccurence As Long
    Dim i
    Dim intI As Integer
    Dim tmp As String
   
    init_Recordset
   '-- Je récupére le chemin
    Repertoire = Frm_Main.chemin1
    '--Je récupére le nom du fichier à chercher
     FichiersRecherchés = Frm_Main.FichierRec & ".txt"
   
    '---Recherche de tous les fichiers souhaités sur le lecteur prévu---
    NombreOccurence = Rechercher(Repertoire, FichiersRecherchés, ResultatRecherche)
    ' Toutes les informations de la recherche sont dans la variables ResultatRecherche
    Select Case ResultatRecherche.Nombre
        Case 0
            MsgBox "AUCUN FICHIER NE CORRESPOND", vbCritical
        Case Else
            '-- On récupère le chemin complet ainsi que le nom du fichier recherché
            Frm_Main.chemin1 = rsFic!chemin.Value & FichiersRecherchés
    End Select
    On Error Resume Next
    If rsFic.Status = adStateOpen Then rsFic.Close
    Set rsFic = Nothing
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
   
    Dim NomDuFichier 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
   
            NomDuFichier = lpFindFileData.cFileName
            'Nettoyage du string renvoyé par l'API
            NomDuFichier = Replace(NomDuFichier, Chr(0), "")
            NomDuFichier = Trim(NomDuFichier)
           
            'S'il ne s'agit pas du dossier...
            If NomDuFichier <> "." And NomDuFichier <> ".." Then
                rsFic.AddNew
                rsFic!nom.Value = NomDuFichier
                rsFic!chemin.Value = chemin
                rsFic.Update
                rsFic.Sort = "Nom DESC"
            End If
           
            ' 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

--> Ce code a été trouvé sur le site de codes sources et adapté à mon besoin...



S.L.B.
<hr />-- Le règlement tu liras -- Des recherches tu feras -- Le style SMS tu banniras --
-- De la validation pertinente tu feras -- Du respect tu auras -- <
Messages postés
7
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
15 octobre 2008

Tu crois qu'avec cette methode ca serait plus rapide? Car en fait il va faloir que je fasse ca pour mes 5000 enregistrements.

Merci en tout cas
Messages postés
1229
Date d'inscription
vendredi 16 novembre 2007
Statut
Membre
Dernière intervention
16 juin 2009
1
Re:

L'api est quelque chose de très rapide... Maintenant je te propose de tester et ensuite tiens nous informé...
Merci

S.L.B.
<hr />-- Le règlement tu liras -- Des recherches tu feras -- Le style SMS tu banniras --
-- De la validation pertinente tu feras -- Du respect tu auras -- <
Messages postés
7
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
15 octobre 2008

Bonjour a tous!


Lilith j'ai quelques soucis avec ton code!

J'ai une erreur dans la configuration de la recherche avec cette variable: "Frm_Main"

Il me dit que la vairable n'est pas definie mais je ne sais pas de quel type de variable il s'agit.

Merci d'avance
Messages postés
7
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
15 octobre 2008

Bon j'ai trouve pourquoi j'avais laisse le Option Explicit en haut.

Sinon j'ai un peu de mal a comprendre ou tu recupere ton chemin et ton nom de fichier.

Frm_main.chemin1 correspond a une form c'est ca?

Si je veux que le nom de fichier corresponde a un champs de ma base kesk je dois faire???


 


Merci d'avance
Messages postés
7
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
15 octobre 2008

Bon j'ai change d'optique car apres mure reflexion je me suis rendu compte qu'il etait idiot de vouloir enregistrer le chemin de mon fichier dans ma base alors qu'il ne servira que pour l'ouverture!

J'ai donc insere mon code dans la procedure d'ouverture de mon fichier lors de la consultation.

Seul probleme mon code actuel (celui poste tout en haut) n'est pas tres efficace.

J'ai bien essaye d'utilise celui de lilith mais je n'arrive pas a l'integre.

J'attends votre aide!

Merci d'avance!
Messages postés
1229
Date d'inscription
vendredi 16 novembre 2007
Statut
Membre
Dernière intervention
16 juin 2009
1
Re:

Tu place le code que je t'ai donné dans un module.
Ensuite, tu appelles le module dans ta form...
'-- Je récupére le chemin
    Repertoire = Frm_Main.chemin1 --> ma variable chemin1 contient le répertoire ou le disque de recherche
    '--Je récupére le nom du fichier à chercher
     FichiersRecherchés = Frm_Main.FichierRec & ".txt" --> ma FichierRec contient le nom du fichier à rechercher...

Bon courage

S.L.B.
<hr />-- Le règlement tu liras -- Des recherches tu feras -- Le style SMS tu banniras --
-- De la validation pertinente tu feras -- Du respect tu auras -- <