Newsgroup: it.comp.lang.visual-basic
Titolo: probl. con DIR

Salve
ho necessita' di implementare un algoritmo che mi fornisca l'elenco dei
file contenuti in un direttorio e in tutti i sottodirettori.
Qualcuno sa se esiste un algoritmo gia' pronto  o qualche funzione di
libreria ?
Grazie.
F.C.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Grazie.
Non credo che esista nulla di gма fatto, usando la funzione Dir di Vb perт
puoi costruirti il tutto facilmente
-- 
Le persone non sono il proprio comportamento: devi sempre andare oltre,
essere flessibile, capire il punto di vista degli altri, interpretarne i
comportamenti ed intuirne le esigenze.
Per rispondere in privato elimina
dall'indirizzo "togliquesto"
MasterDavidex
David Ruscelli


Prova qui:
http://www.it-lang-vb.net

 puoi costruirti il tutto facilmente
FACILMENTE ???
Ma scusa, facilmente come ?


 Ma scusa, facilmente come ?
Crei una funzione ricorsiva con un Do...Loop che aggiunge all'array tutte le
directory che restituisce l'istruzione Dir:
Usa: If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then...
La funzione, ogni volta che incontra una directory, deve aggiungerla
all'array e ciamare se stessa.
Il loop deve finire quando non ci sono piu' file.
dai che non è difficile....


 dai che non è difficile....
No, non è difficile, ma nemmeno facile.
Provaci, visto che la Dir deve esaurirsi (ovvero non vi possono essere Dir
"all'interno" di Dir non concluse) credo che comprenderai...

 "all'interno" di Dir non concluse) credo che comprenderai...
Mo' provo.....


 Mo' provo.....
Per qualche (parziale) suggerimento:
http://makeashorterlink.com/?E40321D07
e anche questo ( ;-) )
http://makeashorterlink.com/?H21514B12

 
http://makeashorterlink.com/?H21514B12
:-PPPP
Questo me l'ero dimenticato....
Ci sono quasi, se solo non mi quillasse il telefono ogni 2 minuti! ;-)

 > Mo' provo.....
FATTO!! :-PPPPPPPPP
Ci ho messo un po' perchè prima speravo di trovarlo già fatto in rete, ma
purtroppo non l'ho trovato, a parte altri sistemi che non utilizzano la dir,
poi ha comincato a squillare il telefono, poi mi sono venuti a trovare in
ufficio un po' di rompipalle, insomma era anche dura concentrarsi a dovere,
poi ho dovuto rifare un lavoro già fatto stamattina ma che era sbagliato
:-//////  nel frattempo continuavano a rompere al telefono...
Ma alla fine...
Tutto è bene quel che finisce bene
Allora...
Veniamo a noi
 è allo stato embrionale, buttato là in fretta e furia ma funziona,
restituisce i nomi di tutte le cartelle e un identificativo per il livello
di appartenenza e li mette in un array, il resto è veramente facile (il
resto sarebbe tirare fuori i file per ogni cartella)
L'array andrebbe reso dinamico, l'ho fatto statico per fare prima
Dunque, in un modulo base
*********************
Type utDirectory
    Percorso As String
    Livello As Integer
End Type
***********************
in un form con un command chiamato command1
*********************************
Option Explicit
Private Directory(0 To 10000) As utDirectory 'livello e percorso
Private Sub trovadir(path As String, Livello As Integer)
On Error GoTo GestioneErrori
Dim MyDir As String
Dim Sottolivelli As Boolean
Dim n As Long
Dim i As Long
    MyDir = Dir(path, vbNormal + vbDirectory + vbHidden + vbArchive +
vbReadOnly + vbSystem + vbVolume) ' Recupera la prima voce.
    Do While MyDir <> ""   ' Avvia il ciclo.
        If (GetAttr(path & MyDir) And vbDirectory) = vbDirectory And MyDir
<> "." And MyDir <> ".." Then
            Debug.Print "Dir " & path & MyDir & " - " & Livello
            Directory(n).Livello = Livello
            Directory(n).Percorso = path & MyDir & "\"
            Sottolivelli = True
            n = n + 1
        End If
        MyDir = Dir
        DoEvents
    Loop
    If Sottolivelli = False Then Exit Sub
    i = 0
    Do While i <= 10000
        If Directory(i).Livello = Livello Then
            If Directory(i).Percorso > "" Then
                Call trovadir(Directory(i).Percorso, Livello + 1)
            End If
        End If
        i = i + 1
    DoEvents
    Loop
GestioneErrori:
    Select Case Err.Number
        Case Is = 5
            MyDir = Dir
            Resume
    End Select
End Sub
Private Sub Command1_Click()
Call trovadir("c:\", 0)
End Sub
************************************************
Lanciare e guardare la finestra di debug
Sembra che funzioni, anche se nell'immediata uan parte del risultato va
perso.... quindi non ho avuto modo di verificare integralmente.


 Grazie.
Io uso, da tempo, la routine che ti allego.
L' ho piu' volte modificata (per adattarla a varie esigenze)
e questa versione dovrebbe (spero) essere la piu' generale di
quelle presenti sul mio PC.  Ho anche un progettino che ho
usato per svilupparla e provarla: se vuoi te lo mando.
Ciao, sperando che sia quello che ti serve.
Franco
----------------------------------------------------------------------------------------
Public Function FindFiles(ByVal FolderSpec$, ByVal SearchStr$, ByRef
FileList$(), _
    Optional ByRef FileCount&, Optional ByRef DirCount&, Optional ByRef
SizeOfFiles#, _
    Optional ByVal bAncheSC As Boolean = True) As Boolean
'
'   Ritorna nel vettore FileList$(1 To FileCount) tutti i files
'   di tipo SearchStr$ contenuti in FolderSpec$ ed (eventualmente)
'   nelle sue sottocartelle.
'   FindFiles ritorna True se FileCount > 0.
'
'   Parametri:
'    FolderSpec$:   folder da esplorare.
'    SearchStr$:    stringa di ricerca dei files (e.g. "*.*", "*.bmp",
...).
'    FileList$():   vettore contenente i nomi (completi di path) dei
files trovati.
'    FileCount:     numero di files trovati.
'    DirCount:      numero di folders (e di sottocartelle) contenuti in
FolderSpec$
'                   (valido solo se bAncheSC = True).
'    SizeOfFiles:   ritorna con la somma delle lunghezze in [Bytes] dei
files trovati.
'    bAncheSC:      se True ricerca, ricorsivamente, anche i files
contenuti
'                   nelle sottocartelle di FolderSpec$.
'
'   Nota: le variabili FileCount, DirCount, SizeOfFiles ed il vettore
'         FileList$() non vengono azzerati chiamando questa routine.
'         Questo permette, con chiamate successive, di raccogliere in
'         FileList$() i files di diversi folders.
'
'   Warning:    All rights reserved to Maged Said Abdel Latif
'   E-Mail:     
maged...@hotmail.com
'
'   Nota: la routine originale di Maged Said e' stata modificata.
'
    Dim I&, nDir&
    Dim FileName$, DirName$, dirNames$()
'
    On Error GoTo sysFileERR
'
    If Right$(FolderSpec$, 1) <> "\" Then FolderSpec$ = FolderSpec$ &
"\"
'
    ' Trova tutti i files di tipo SearchStr$ contenuti direttamente in
FolderSpec$:
    FileName$ = Dir(FolderSpec$ & SearchStr, _
                    vbNormal Or vbHidden Or vbSystem Or vbReadOnly)
    While (Len(FileName$) <> 0)
        If (FileName$ <> "?") Then
            SizeOfFiles = SizeOfFiles + CDbl(FileLen(FolderSpec$ &
FileName$))
            FileCount = FileCount + 1
            ReDim Preserve FileList$(1 To FileCount)
            FileList$(FileCount) = FolderSpec$ & FileName$
        End If
'
        FileName$ = Dir()
    Wend
'
    If bAncheSC Then
        ' Trova tutti i folders contenuti direttamente in FolderSpec$:
        nDir = 0
        DirName$ = Dir(FolderSpec$, vbDirectory Or vbHidden Or vbSystem)
        Do While Len(DirName$) <> 0
            If (DirName$ <> ".") And (DirName$ <> "..") And (DirName$ <>
"?") Then
                If GetAttr(FolderSpec$ & DirName$) And vbDirectory Then
                    nDir = nDir + 1
                    ReDim Preserve dirNames$(1 To nDir)
                    dirNames$(nDir) = DirName$
                    DirCount = DirCount + 1
                End If
'
sysFileERRCont:
            End If
'
            DirName$ = Dir()
        Loop
'
        ' Se FolderSpec$ contiene dei folders richiama, ricorsivamente,
        ' questa routine per ogni folder trovato:
        For I = 1 To nDir
            Call FindFiles(FolderSpec$ & dirNames$(I), SearchStr$,
FileList$(), _
                           FileCount, DirCount, SizeOfFiles)
        Next I
    End If
'
    FindFiles = (FileCount > 0)
'
AbortFunction:
    Exit Function
'
sysFileERR:
    If Right$(DirName$, 4) = ".sys" Then
        Resume sysFileERRCont
    Else
        MsgBox "Error: " & Err.Number & " - " & Err.Description,
vbCritical, _
        "Unexpected Error in FindFiles"
        Resume AbortFunction
    End If
'
'
'
End Function

 [------] o qualche funzione di libreria ?
'fso >> *.vbs
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder("C:\Windows")
Set filetxt = ofso.CreateTextFile("c:\dir.txt", True)
For Each oSubFolder In oFolder.SubFolders
 '   WScript.Echo oSubFolder.Name
filetxt.Write oSubFolder.Name & VBCrLf
Next
--
Fosco