Newsgroup: it.comp.lang.visual-basic
Titolo: Sapere il numero di files in uno sciame di sottocartelle

Salve, come posso fare per sapere il totale del numero di files che ci sono
in una cartella e in tutte le sue sottocartelle ?
Grazie

 in una cartella e in tutte le sue sottocartelle ?
Vedi Dir
Attenzione: La Dir all'interno di una Dir precedente e non conclusa, ne
sputtana i risultati, quindi ad ogni nuovo livello, devi salvarti il tutto
in un vettore...

Grazie.
Sarebbe possibile avere anche l'elenco di questi file completi di percorso
(Vb6) ?
Mi dici le due righe di codice per far questo, perchè ci sto studiando su ma
non capisco proprio come fare.
Questa Dir mi sembra un pò limitata come funzione.
Grazie ancora


 Questa Dir mi sembra un pň limitata come funzione.


 Questa Dir mi sembra un pň limitata come funzione.
Affatto. La Dir (a parte il problema che ti dicevo) č completissima. Il
percorso lo conosci ... perchč l'hai passato alla Dir stessa...
Esempio (per i parametri per file/cartelle "speciali" vedi la guida):
nome_file= Dir ("C:\Cartella\*.eventuale_estensione_viceversa_*" [,eventuali
parametri])
Do
    If nome_file="" then Exit Do
    '... fai quello che devi su nome_file (il percorso lo conosci)
    nome_file=Dir
Loop

In particolare vorrei capire: visto che la Dir mi trova i file anche nelle
sottocartelle, come faccio poi a sapere il percorso dei file trovati ?
Grazie


 come faccio poi a sapere il percorso dei file trovati ?
Il percorso per la Dir glielo devi dare tu, quindi lo conosci. Non lo dirò
mai più.

 percorso lo conosci ... perchè l'hai passato alla Dir stessa...


 meglio di quelle del Visual Basic.
No, non mi pare che la Dir del DOS esplodesse anche i file delle
sottocartelle...

 wrote in message
news:b8trg4$una$1...@lacerta.tiscalinet.it...


 sottocartelle...
"DIR /S" dal DOS... ohi, la butto lì... 3.0 in su. Una cosa carina era
la (non documentata) Truename, che dava il vero (e completo di
path) nome di un file anche se c'era stata una Subst, una Assign
o qualcosa di simile.
Bye, G.

 "DIR /S" dal DOS... ohi, la butto lě... 3.0 in su.
Boh, ammetto la mia stratosferica ignoranza.

 Boh, ammetto la mia stratosferica ignoranza.
Un "dirty hack" redirigo l'output del comando dos su un file e poi vado a
leggermi lě la dimensione e il numero totale dei files: stilisticamente
orrendo ma efficace e di implementazione rapida! :-)

Ok, ho risolto, anche se ho capito ben poco di come funziona tutta la
ricorsione.
Comunque con la DIR del DOS sarebbe bastata una sola riga e senza bisogno di
2 ListBox.
Grazie a tutti
-----
Private Sub cmdgo_Click()
lstfiles.Clear
lstdirs.AddItem "G:\foto"  'Cartella iniziale
Do
  lbltime = "Searching . . . " & lstdirs.List(0)
    findfilesdir lstdirs.List(0), "*.jpg"
    lstdirs.RemoveItem 0
Loop Until lstdirs.ListCount = 0
End Sub
Public Sub findfilesdir(DirPath As String, FileSpec As String)
Dim filestring As String
DirPath = Trim$(DirPath)
If Right$(DirPath, 1) <> "\" Then
  DirPath = DirPath & "\"
End If
filestring = Dir$(DirPath & FileSpec, vbArchive Or vbHidden Or vbSystem Or
vbDirectory)
Do
  DoEvents
  If filestring = "" Then
    Exit Do
  Else
    If (GetAttr(DirPath & filestring) And vbDirectory) = vbDirectory Then
      If Left$(filestring, 1) <> "." And Left$(filestring, 2) <> ".." Then
        lstdirs.AddItem DirPath & filestring & "\", 1
      End If
    Else
      lstfiles.AddItem DirPath & filestring
    End If
  End If
  filestring = Dir$
Loop
End Sub

 ha scritto nel messaggio
news:b8ub1j$afh$1...@lacerta.tiscalinet.it...


 C'è un modo per cercare in queste benedette sottocartelle ?
ScanCartelle sul Sito Comune, 
http://www.it-lang-vb.net/
.
Bye, G.

Mi guardavo intorno, tentando di sembrare una persona
normale, quando <*Blisset®*> all'improvviso disse:
Dimenticavo: anche AllDir, VBSubDirs, DirTree e DirTreeView,
sempre sul Sito Comune, oppure cerca in google per "dir ricorsiva".
Oppure c'è un esempio nei Samples di VB, WinSeek, vedi la sub
DirDiver.
Bye, G.

 stilisticamente orrendo ma efficace e di implementazione rapida! :-)
^_- la stessa identica "grezzata" che stavo proponendo io ^_^
-- 
<Gigio2K>
Sito Comune
Nokia -> I.T.H.N. -> 
http://www.ithn.it/
VB -> I.C.L.VB -> 
http://www.it-lang-vb.net/

C'ho provato:
'Creare un form piuttosto largo
'Inserire nel form un ListBox con nome lst piuttosto largo
'e con un font a passo fisso (Fixedsys).
'Inserire nel form un bottone con nome btn, anch'esso
'piuttosto largo. Incollare quanto segue:
Dim livello As Integer
Dim livello_max As Integer
Dim t_files As Long
Dim t_cartelle As Long
Dim t_elementi As Long
Private Sub btn_Click()
    lst.Clear
    lst.Visible = 0
    livello = 0
    livello_max = 0
    percorso = "C:\VB6"    '<<<--- Impostare il percorso iniziale desiderato
    Call analizza(percorso)
    lst.AddItem "---------", 0
    lst.AddItem "Liv.Max : " & livello_max, 0
    lst.AddItem "Cartelle: " & t_cartelle, 0
    lst.AddItem "Files   : " & t_files, 0
    lst.AddItem "Percorso: " & percorso, 0
    Me.Caption = "Esplosione percorso"
    btn.Caption = "Procedi"
    lst.TopIndex = 0
    lst.ListIndex = 0
    lst.Visible = 1
    lst.SetFocus
End Sub
Sub analizza(percorso_passato)
    percorso = percorso_passato
    btn.Caption = percorso
    If Right(percorso, 1) <> "\" Then percorso = percorso & "\"
    ReDim el_files(0 To 0)
    file = Dir(percorso & "*.*", vbArchive + vbDirectory + vbHidden +
vbNormal + vbReadOnly + vbSystem + vbVolume)
    Do
        If file = "" Then Exit Do
        Select Case file
            Case ".", ".."
            Case Else
                ReDim Preserve el_files(0 To UBound(el_files) + 1)
                el_files(UBound(el_files)) = file
        End Select
        file = Dir
    Loop
    For n = 1 To UBound(el_files)
        file = el_files(n)
        t_elementi = t_elementi + 1
        Me.Caption = t_elementi
        c = IIf(e_cartella(percorso & file), 1, 0)
        lst.AddItem Format(t_elementi, "00000000") & " " & IIf(c, ">", " ")
& Space(livello * 2 + 1) & percorso & file
        If c Then
            t_cartelle = t_cartelle + 1
            livello = livello + 1
            If livello > livello_max Then livello_max = livello
            Call analizza(percorso & file)  'Ricorsione
            livello = livello - 1
        Else
            t_files = t_files + 1
        End If
    Next n
    ReDim el_files(0 To 0)
    'lst.Refresh
    DoEvents
'       Si impiantano alla capacita' max dell'intero
    'If lst.ListCount Then
    '    lst.ListIndex = lst.ListCount - 1
    '    lst.TopIndex = lst.ListCount - 1
    'End If
End Sub
Function e_cartella(file)
    risultato = 0
    comodo = "?"
    On Error Resume Next
    comodo = GetAttr(file)  'Puo' dare errore se file e' un file di sistema
'                           '(presumo in uso) come Pagefile.sys sotto WinNT
    On Error GoTo 0
    If comodo = "?" Then comodo = vbSystem
    If (comodo And vbDirectory) Then risultato = 1
    e_cartella = risultato
End Function

Sì, il sorgente di ScanCartelle è molto simile a quello che ho riportato io
prima, ma c'è lo stesso identico limite.
Appena, al posto di "*.*" si mette un qualsiasi altro filtro (ad es.
"*.jpg"), non vengono scandite più le sottocartelle, ma solo la cartella
principale.
Quindi possono essere scanditi solo *tutti* i files, non solo alcuni tipi di
files.
C'è qualcuno che sa come modificare questo codice per poter mettere un
filtro ai files ?
Grazie
Riporto qui entrambi i codici:
-------------------------------------------------------------------Codice
che avevo postato prima


--------------------------------------------------------------------ScanCart
elle
Private Sub Form_Load()
    List1.Visible = False
    Me.Show
    DoEvents
    Call ScansioneCartelle("G:\Prova")
    List1.Visible = True
    Text1.Visible = False
End Sub
Sub ElaboraFile(Pathfile$, AttributiFile As Integer)
    ' Qui potete aggiungere il codice che
    ' elabora il file trovato
    List1.AddItem Pathfile$
End Sub
' Algoritmo di scansione. Sfrutta la ricorsione per scandire al
sottocartelle
Sub ScansioneCartelle(ByVal ActPath$)
    Dim AttributiFile  As Integer
    Dim ElencoCartelle$
    Dim file$
    ElencoCartelle$ = ""
    If Right$(ActPath$, 1) <> "\" Then ActPath$ = ActPath$ & "\"
    On Error Resume Next
    file$ = Dir$(ActPath$ & "*.*", vbDirectory + vbNormal)
    Do While Len(file$)
        If file$ <> "." And file$ <> ".." Then
            Err = 0
            ' Ricavo gli attributi del file per vedere se è una cartella e
se il file è valido ed accessibile
            ' inoltre se vi serve conoscere gli attributi, sono in
AttributiFile
            AttributiFile = GetAttr(ActPath$ & file$)
            If Err = 0 Then
                If (AttributiFile And vbDirectory) Then
                    ' File$ è una cartella
                    ' Mi ricordo che questa cartella la dovro' scandire
                    ElencoCartelle$ = ElencoCartelle$ & file$ & vbCrLf
                Else
                    ' File$ è un file
                    ' LO analizzo
                    Call ElaboraFile(ActPath$ & file$, AttributiFile)
                End If
            End If
        End If
        file$ = Dir$
    Loop
    On Error GoTo 0
    ' Tutte le sottocartelle in modo ricorsivo
    Dim Pos%
    Do While Len(ElencoCartelle$)
        Pos% = InStr(ElencoCartelle$, vbCrLf)
        If Pos% Then
            file$ = ActPath$ & Left$(ElencoCartelle$, Pos% - 1)
            ElencoCartelle$ = Mid$(ElencoCartelle$, Pos% + Len(vbCrLf))
        Else
            file$ = ActPath$ & ElencoCartelle$
            ElencoCartelle$ = ""
        End If
        Call ScansioneCartelle(file$)
    Loop
End Sub

 C'ho provato:
...
Per fare scelte sull'estensione e mantenere l'analisi delle sottocartelle,
modifica il For n ... all'interno della Sub analizza come segue
    For n = 1 To UBound(el_files)
        file = el_files(n)
        c = IIf(e_cartella(percorso & file), 1, 0)
        If c <> 0 Or Right(UCase(file), 4) = ".BAS" Then
'<<<---Estensione desiderata
            t_elementi = t_elementi + 1
            Me.Caption = t_elementi
            lst.AddItem Format(t_elementi, "00000000") & " " & IIf(c, ">", "
") & Space(livello * 2 + 1) & percorso & file
            If c Then
                t_cartelle = t_cartelle + 1
                livello = livello + 1
                If livello > livello_max Then livello_max = livello
                Call analizza(percorso & file)  'Ricorsione
                livello = livello - 1
            Else
                t_files = t_files + 1
            End If
        End If
    Next n

 ha scritto nel messaggio
news:b8urnb$dqlti$1...@ID-174464.news.dfncis.de...


 C'è un limite massimo di righe al quale il programma si blocca ?
Versione (completa) rivista e corretta, con maggiori funzionalità (vedere
note)
Se il WebMaster ne vuol fare una FAQ, ... quanto serve è in quanto segue:
'---
'Esplosione Percorso (by Lupo, NG: ICLVB, 03-05-2003)
'con scelta di nessuna, una o piu' estensioni
'e scelta elenco cartelle e/o cartelle vuote dei files cercati.
'Istruzioni per l'uso:
'Creare un form piuttosto largo.
'Inserire nel form un ListBox con nome "lst"
'piuttosto largo e con un font a passo fisso (Fixedsys).
'Proprieta' Sorted=False.
'Inserire nel form un CommandButton con nome "btn",
'anch'esso piuttosto largo e alto per un paio di righe.
'ATTENZIONE: Il ListBox ha delle limitazioni (entro l'intero)
'per cui non puo' essere trattato direttamente, bisognerebbe
'cioe' usare un altro strumento di visualizzazione.
'Si aggira l'ostacolo creando un vettore_risultati,
'poi esposto nel ListBox.
'Non ho riscontrato problemi di saturazione (circa 100.000 files)
'Nella sezione dichiarazioni del form, incollare quanto segue:
Dim livello As Integer
Dim livello_max As Integer
Dim t_files As Long
Dim t_cartelle As Long
Dim t_cartelle_vuote As Long
Dim t_elementi As Long
Dim vettore_risultati() As String
'     --- Personalizzare
Const titolo = "Esplosione Percorso (by Lupo, NG: ICLVB, 03-05-2003)"
Const percorso_partenza = "C:\VB6"            '<<<--- Impostare il percorso
di partenza desiderato
Const estensioni_desiderate = ".BAS,.FRM"     '<<<--- Impostare le
estensioni desiderate (".???,.???,.???") ("" se tutte)
Const elencare_cartelle = True                '<<<--- Impostare a True o
False
Const elencare_cartelle_vuote = True          '<<<--- Impostare a True (solo
se precedente=True) o False
'     ------------------
Private Sub Form_Load()
    Call adatta
End Sub
Sub adatta()
    Me.Caption = titolo
    btn.Caption = "O&K, esplodi " & percorso_partenza & " per estensioni: "
& estensioni_desiderate
    lst.Visible = 0
End Sub
Private Sub btn_Click()
    lst.Clear
    livello = 0
    livello_max = 0
    Beep
    tempo = Timer
    Call analizza(percorso_partenza)
    tempo_esplosione = Timer - tempo
    Beep
'       Numera ed espone i risultati
    tempo = Timer
    For elemento = 1 To t_elementi
        lst.AddItem Format(elemento, "00000000") & " " &
vettore_risultati(elemento)
    Next elemento
    tempo_visualizzazione = Timer - tempo
    lst.AddItem "-----------------", 0
    lst.AddItem "Livello Max     : " & livello_max, 0
    lst.AddItem "Cart.esp.+Files : " & t_cartelle + t_files, 0
    lst.AddItem "Cartelle vuote  : " & t_cartelle_vuote, 0
    lst.AddItem "Cartelle esposte: " & t_cartelle, 0
    lst.AddItem "Files           : " & t_files, 0
    lst.AddItem "Sec.Visualizz.  : " & tempo_visualizzazione, 0
    lst.AddItem "Sec.Esplosione  : " & tempo_esplosione, 0
    lst.AddItem "El.Cart.Vuote   : " & elencare_cartelle_vuote, 0
    lst.AddItem "El.Cartelle     : " & elencare_cartelle, 0
    lst.AddItem "Estensioni      : " & estensioni_desiderate, 0
    lst.AddItem "Percorso        : " & percorso_partenza, 0
    Call adatta
    lst.TopIndex = 0
    lst.ListIndex = 0
    lst.Visible = 1
    lst.SetFocus
    Beep
End Sub
Function analizza(percorso_passato)
'   Restituisce il numero dei files (non delle cartelle) nel
percorso_passato
    t_files_percorso = 0
    percorso = percorso_passato
    btn.Caption = percorso
    If Right(percorso, 1) <> "\" Then percorso = percorso & "\"
    ReDim el_files(0 To 0)
    file = Dir(percorso & "*.*", vbArchive + vbDirectory + vbHidden +
vbNormal + vbReadOnly + vbSystem + vbVolume)
    Do
        If file = "" Then Exit Do
        Select Case file
            Case ".", ".."
            Case Else
                ReDim Preserve el_files(0 To UBound(el_files) + 1)
                el_files(UBound(el_files)) = file
        End Select
        file = Dir
    Loop
    For n = 1 To UBound(el_files)
        file = el_files(n)
        c = IIf(e_cartella(percorso & file), 1, 0)
        Do
            elencare = 1
            If c Then Exit Do
            If estensioni_desiderate <> "" Then
                comodo = estensioni_desiderate
                Do
                    If comodo = "" Then
                        elencare = 0
                        Exit Do
                    End If
                    virgola = InStr(comodo, ",")
                    If virgola = 0 Then virgola = Len(comodo) + 1
                    estensione = UCase(Trim(Left(comodo, virgola - 1)))
                    comodo = Mid(comodo, virgola + 1)
                    If Right(UCase(file), Len(estensione)) = estensione Then
Exit Do
                Loop
            End If
            Exit Do
        Loop
        If elencare Then
            If c Then
                If elencare_cartelle = False Then
                    elencare = 0
                Else
                    t_cartelle = t_cartelle + 1
                End If
            Else
                t_files = t_files + 1
                t_files_percorso = t_file_percorso + 1
            End If
            If elencare Then
                t_elementi = t_elementi + 1
                Me.Caption = t_elementi
                salva_t_elementi = t_elementi
                'lst.AddItem Format(t_elementi, "00000000") & " " & IIf(c,
">", " ") & Space(livello * 2 + 1) & percorso & file
                ReDim Preserve vettore_risultati(0 To t_elementi)
                vettore_risultati(t_elementi) = IIf(c, ">", " ") &
Space((livello * 2) + 1) & percorso & file
            End If
            If c Then
                livello = livello + 1
                If livello > livello_max Then livello_max = livello
                t_files_cartella = analizza(percorso & file)    'Ricorsione
                livello = livello - 1
                If t_files_cartella = 0 Then
                    t_cartelle_vuote = t_cartelle_vuote + 1
                    If elencare_cartelle_vuote = False Then
                        'lst.RemoveItem (salva_t_elementi - 1)   'Si
impianta se salva_t_elementi > intero
                        t_cartelle = t_cartelle - 1
                        t_elementi = t_elementi - 1
                    End If
                End If
            End If
        End If
    Next n
    ReDim el_files(0 To 0)
    'lst.Refresh
    DoEvents
'       Si impiantano oltre l'intero
    'If lst.ListCount Then
    '    lst.ListIndex = lst.ListCount - 1
    '    lst.TopIndex = lst.ListCount - 1
    'End If
    analizza = t_files_percorso
End Function


*Lupo* ha scritto:
Primo baco (per elencare_cartelle=False e elencare_cartelle_vuote=False):
Nella Function analizza (verso il suo fondo) modificare il test di
eliminazione cartella vuota come segue:
                If t_files_cartella = 0 Then
                    t_cartelle_vuote = t_cartelle_vuote + 1
                    If elencare_cartelle_vuote = False And elencare_cartelle
= True Then    '<<<MODIFICA


Non so perchè ma mi si pianta perchè t_elementi diventa -3.
Il percorso in cui si blocca è questo:
G:\Backup\Identities\{7443B922-1D44-4F56-83E0-2D85C3876ECA}\Microsoft\Outloo
k Express
Dato che a me serve l'elenco dei files senza numerazione o spazi se metto:
vettore_risultati(t_elementi) = percorso & file
al posto di:
vettore_risultati(t_elementi) = IIf(c, ">", " ") & Space((livello * 2) + 1)
& percorso & file
funziona senza problemi ?
Grazie

 funziona senza problemi ?
Sì, sono normalissime stringhe che non subiscono alcuna elaborazione

Faresti il favore di EVITARE di cambiare ripetutamente
il subject ? >:-|
Bye, G.