Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - Ricerca di un file conoscendo il nome
Forum - Visual Basic 6 - Ricerca di un file conoscendo il nome

Avatar
Berto (Normal User)
Newbie


Messaggi: 14
Iscritto: 30/05/2010

Segnala al moderatore
Postato alle 22:28
Martedì, 31/08/2010
Avrei bisogno di un aiuto per conoscere il percorso di un file, per esempio prova.txt e poterlo inserire in una variabile. Ho controllato sul sito e ho trovato solo una discussione in vb.net e io non sono abbastanza esperto per tradurla in visual basic 6. Su google non  sono riuscito a ottenere nulla, anche estendendo il campo di ricerca all'inglese, tranne che un algoritmo di cui capisco a malapena tre righe ma che forse potrebbe essere più comprensibile a programmatori esperti e risolvere il problema. :-|
Codice sorgente - presumibilmente VB.NET

  1. Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
  2. Private Declare Function SearchTreeForFile Lib "imagehlp" (ByVal RootPath As String, ByVal InputPathName As String, ByVal OutputPathBuffer As String) As Long
  3.  
  4. Public Function SearchAllDrives(pstrFile As String) As String
  5. Dim i As Long
  6. Dim strDrives() As String
  7. Dim strMatch As String
  8. For i = 1 To EnumerateDrives(strDrives)
  9. strMatch = SearchDriveForFile(pstrFile, strDrives(i))
  10. If Len(strMatch) <> 0 Then
  11. SearchAllDrives = strMatch
  12. Exit Function
  13. End If
  14. Next
  15. End Function
  16.  
  17. Public Function EnumerateDrives(pstrDrives() As String) As Long
  18.  
  19. Dim i As Long
  20. Dim strBuffer As String
  21. Dim strDrive As String
  22. ReDim pstrDrives(1 To 1)
  23. strBuffer = Space$(255)
  24. strBuffer = Left$(strBuffer, GetLogicalDriveStrings(255, ByVal strBuffer))
  25. Do While InStr(strBuffer, "")
  26. strDrive = Left$(strBuffer, InStr(strBuffer, "") - 1)
  27. i = i + 1
  28. ReDim Preserve pstrDrives(1 To i)
  29. pstrDrives(i) = strDrive
  30. strBuffer = Mid$(strBuffer, Len(strDrive) + 3)
  31. Loop
  32. If pstrDrives(1) = "" Then
  33. Erase pstrDrives
  34. EnumerateDrives = 0
  35. Else:
  36. EnumerateDrives = i
  37. End If
  38. End Function
  39.  
  40. Public Function SearchDriveForFile(pstrFile As String, Optional ByVal pstrDrive As String = "C:") As String
  41. Const MAX_PATH = 260
  42. Dim strPath As String
  43. Dim lngReturn As Long
  44. strPath = String(MAX_PATH, 0)
  45. pstrDrive = Left$(pstrDrive, 1) & ":"
  46. If SearchTreeForFile(pstrDrive, pstrFile, strPath) <> 0 Then SearchDriveForFile = Left$(strPath, InStr(1, strPath, Chr$(0)) - 1)
  47. End Function



Chissà cosa diavolo ho postato? Non prendetevela se è un virus, ok? :rofl::rofl:

Tornando seri, non ho idea di come fare. In teoria si potrebbe utilizzare la velocità di calcolo del pc per scansire tutto l'hard disk con un metodo try and error ma non so fare neanche quello. Se esistono delle funzioni o dei comandi in visual basic 6 possono essere una risposta più elegante ma ogni aiuto sarebbe comunque molto gradito.
Vi ringrazio in anticipo per le risposte, non è un problema urgente.

PM
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 23:52
Martedì, 31/08/2010
Quello che hai postato è un buon esempio per ottenere ciò che vuoi.

La funzione di partenza che ti restituirà il percorso completo del file è SearchAllDrives
e la usi così:
Codice sorgente - presumibilmente Plain Text

  1. PercorsoCompleto = SearchAllDrives(NomeDelFile)


SearchAllDrives richiama EnumerateDrives che le restituisce le lettere dei drive presenti nel sistema (C:\,D:\,ecc).
Di ogni disco con SearchDriveForFile lancia la funzione SearchTreeForFile che se trova il file restituisce il percorso completo.


Ps. per farla funzionare devi modificare queste righe
Codice sorgente - presumibilmente Plain Text

  1. strDrive = Left$(strBuffer, InStr(strBuffer, Chr(0)) - 1)
  2.       ...
  3.       ...
  4.       ...
  5.       strBuffer = Mid$(strBuffer, InStr(strBuffer, Chr(0)) + 1)



Naturalmente facendo la scansione di tutti i dischi devi avere molta pazienza!

Ultima modifica effettuata da Alfonso il 01/09/2010 alle 0:00
PM
Avatar
Berto (Normal User)
Newbie


Messaggi: 14
Iscritto: 30/05/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 8:16
Mercoledì, 01/09/2010
Grazie Alfonso, è la seconda volta che mi aiuti e ho fatto solo due domande...
L'algoritmo modificato funziona, non è velocissimo ma per l'uso che ne faccio non è un problema e in più quando qualcuno cercherà la stessa risposta potrà trovarla senza dover cercare nei siti inglesi con il traduttore di google(che per di più tenta di tradurti anche l'algoritmo).

PM