Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 41
  1. #1

    Vb net - Contare file in cartella (Sistema)

    Inizio col dire che questa è una prova che sto facendo.
    Allora, voglio contare quanti file stanno in una cartella (compresi quelli nelle sottocartelle).

    Utilizzo il codice My.Computer.FileSystem.GetFiles("Path", FileIO.SearchOption.SerachAllSubDirectories).Count.
    Ok, fin qui tutto bene, specialmente se analizzo cartelle che non richiedono permessi particolari, però appena vado ad analizzare una cartella per cui non ho i permessi... ecco il codice:
    codice:
    MessageBox.Show(My.Computer.FileSystem.GetFiles("C: Windows\System32\", FileIO.SearchOption.SearchAllSubDirectories).Count)
    Ricevo l'errore:
    UnauthorizedAccessException:
    Accesso al percorso 'C:\Windows\System32\logFiles\WMI\RtBackup' negato


    Come posso evitare ciò??
    Ovviamente non posso utilizzare un Try perchè non effettuerebbe il controllo. Per me è ESSENZIALE avere quel valore, quindi non posso saltarlo... cosa mi consigliate??

  2. #2
    Se il tuo utente non ha i permessi per accedere a quella sottodirectory non ci puoi fare niente, è giusto e normale che il tuo programma sollevi quell'eccezione. Quello che puoi fare è implementare manualmente una ricerca ricorsiva e saltare le singole directory a cui non puoi accedere.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Se il tuo utente non ha i permessi per accedere a quella sottodirectory non ci puoi fare niente, è giusto e normale che il tuo programma sollevi quell'eccezione. Quello che puoi fare è implementare manualmente una ricerca ricorsiva e saltare le singole directory a cui non puoi accedere.
    Ovviamente so che è più che giusto.
    (Credo di No ma chiedo...) non c'è modo di evitare quella cartella?
    Cioè mettiamo che in "C:\Prova\" ho 3 cartelle ("1", "2", "3")
    Ora creo una nuova applicazione in vb net che alla pressione di un button mi controlli il numero completo di file presenti in "C:\Prova\*.*", quindi faccio:
    codice:
    Dim Path as string = "C:\Prova\"
    MessageBox.Show("La cartella Prova contiene: " & My.Computer.FileSystem.GetFiles("Path", FileIO.SearchOption.SerachAllSubDirectories).Count & " File.")
    Ora io elimino le autorizzazioni alla cartella "C:\Prova\2\" ed il programma appena va a contare il numero di file presenti si blocca restituendo l'errore.


    Ora quindi le domande sono due:
    - Posso far in modo che appena trova una cartella (in quasto caso "C:\Prova\2") a cui non ha l'accesso la salti?
    - Posso far in modo di ricevere il numero di file contenuti nella cartella anche se non ne ho accesso? (Sembra fantascienza quindi l'escluderei )

  4. #4
    Quote Originariamente inviata da deamon75 Visualizza il messaggio
    Ora quindi le domande sono due:
    - Posso far in modo che appena trova una cartella (in quasto caso "C:\Prova\2") a cui non ha l'accesso la salti?
    Sì, ma non puoi usare GetFiles direttamente, devi scriverti il codice di ricerca ricorsiva a mano, piazzando i dovuti Try ... Catch per ignorare una determinata cartella se non è accessibile. Concettualmente non è complicato, basta scrivere una funzione che, usando System.IO.DirectoryInfo, enumeri i file e le directory contenute in essa; i file li conta, e sulle directory richiama ricorsivamente sé stessa e somma il valore restituito al totale.
    - Posso far in modo di ricevere il numero di file contenuti nella cartella anche se non ne ho accesso? (Sembra fantascienza quindi l'escluderei )
    No.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Quindi:
    1. Creo un elenco di File e Cartelle presenti in "C:\Prova"
    2. Per ogni file trovato metto un +1 ad una variante di tipo Integer
    3. Per ogni cartella in "C:\Prova\", richiamo la funzione eseguita al punto 1
    Ho capito bene??

    EDIT: <--- Fin qui ho provato (IN MANIERA GREZZA) e funziona.... Ovviamente ora che sistemo metto il codice.



    Domanda:
    Tramite IO.DirectoryInfo mi sa che posso vedere se ho i permessi per accedere alla cartella, Giusto?
    Se cosi fosse poteri, oltre o invece, di usare il Try...Catch impostare una condizione che mi esegua la "Ricorsione" solo SE ho l'accesso alla cartella <- non so se mi son spiegato, qualcosa di tipo:
    If hoaccesso(cartella) = true then
    funzione(cartella)
    end if
    questo blocco lo potrei benissimo impostare al punto 3 (vedi sopra)
    Ultima modifica di deamon75; 07-10-2013 a 19:01

  6. #6
    Ecco il codice che ho usato:
    codice:
    Function analizza(ByVal x As System.IO.DirectoryInfo)
         For Each file As IO.FileInfo In x.GetFiles
              On Error Resume Next 'Cambierò con un Try..Catch per avere una performance migliore
              a = a + 1 'Ovviamente ho già dichiarato "a" come Integer
         Next
         For Each dir As IO.DirectoryInfo In x.GetDirectories
              analizza(dir)
         Next
         Return a
    End Function
    Che ne dici?? (@MItaly)


    Invece quel che volevo aggiungere era un:
    codice:
    Function analizza(ByVal x As System.IO.DirectoryInfo)
         For Each file As IO.FileInfo In x.GetFiles
              On Error Resume Next 'Cambierò con un Try..Catch per avere una performance migliore
              a = a + 1 'Ovviamente ho già dichiarato "a" come Integer
         Next
         For Each dir As IO.DirectoryInfo In x.GetDirectories
              'AGGIUNGO:
              If (ho accesso alla directory) Then
                   analizza(dir)
              End If
         Next
         Return a
    End Function
    Questo alleggerirebbe per bene l'esecuzione!

  7. #7
    UP

  8. #8
    Quote Originariamente inviata da deamon75 Visualizza il messaggio
    Ecco il codice che ho usato:
    Si può semplificare:
    codice:
    Function RecursiveFilesCount(ByVal d As System.IO.DirectoryInfo) As Long
        Dim c As Long
        c+=d.GetFiles().Count
        For Each dir As IO.DirectoryInfo In d.GetDirectories
            Try
                c+=RecursiveFilesCount(dir)
            Catch ex As UnauthorizedAccessException
            End Try
        Next
        Return c
    End Function
    Invece quel che volevo aggiungere era un:
    Questo alleggerirebbe per bene l'esecuzione!
    Al di là del fatto che non sarebbe facile fare quel controllo, resta una cattiva idea, dato che introduci una race condition tra il controllo dei permessi e l'effettivo accesso; inoltre, non credo che le performance migliorerebbero in alcuna maniera (specie visto che in questo codice il collo di bottiglia è l'IO, non la CPU).
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Il codice riporta questo errore:
    codice:
    c+=d.GetFiles().Count
    Errore    1    'count' non è un membro di 'System.Array'.
    Ho sostituito Count con Length e funziona.



    Comunque io devo creare una progressbar quindi dovrei utilizzare 2 volte questa funzione giusto?
    1. per riceve il numero totale dei file
    2. (SOLO la seconda volta) la uso effettivamente per eliminare i file e quindi riempire la progressbar

    Questo perchè (almeno per quel che penso io) non posso fare che la stessa funzione imposti il valore maximum della progressbar e alla stesso tempo la riempia(eliminando i file) sbaglio?



    PS:
    c += RecursiveFilesCount(dir)
    Non c'avevo proprio pensato, non conoscevo questa tecnica... Incredibile quante cose si possono imparare in pochissimo tempo da chi ha esperienza! Thanks
    Ultima modifica di deamon75; 09-10-2013 a 16:30

  10. #10
    Quote Originariamente inviata da deamon75 Visualizza il messaggio
    Il codice riporta questo errore:
    codice:
    c+=d.GetFiles().Count
    Errore    1    'count' non è un membro di 'System.Array'.
    Ho sostituito Count con Length e funziona.
    Pardon, è tanto tempo che non lavoro in .NET, non mi ricordo mai se è count (come in alcune robe delle Qt e della STL in C++), length (come in alcune classi Qt e simile al len() di Python) o size (come in altre robe della STL).
    Comunque io devo creare una progressbar quindi dovrei utilizzare 2 volte questa funzione giusto?
    1. per riceve il numero totale dei file
    2. (SOLO la seconda volta) la uso effettivamente per eliminare i file e quindi riempire la progressbar

    Questo perchè (almeno per quel che penso io) non posso fare che la stessa funzione imposti il valore maximum della progressbar e alla stesso tempo la riempia(eliminando i file) sbaglio?
    Credo che in tal caso ti convenga, invece di limitarti a contarli, aggiungere i file ad una qualche genere di lista; quando li hai recuperati, hai il conteggio dei file da eliminare (basta misurare quanti elementi contiene la lista) e non devi fare più una ricerca ricorsiva (li hai già tutti in una lista su cui puoi iterare tranquillamente).
    PS:
    c += RecursiveFilesCount(dir)
    Non c'avevo proprio pensato, non conoscevo questa tecnica... Incredibile quante cose si possono imparare in pochissimo tempo da chi ha esperienza! Thanks
    È un classico caso di funzione ricorsiva, se cerchi su internet ci sono tanti esempi.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.