Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [VB.NET] Eseguire funzioni su determinate directory indicate tramite CheckBox

    Ciao a tutti,
    Non so bene come spiegarmi ma ci provo...

    Io c'ho una funzione che elimina tutto i file in una specifica cartella quindi appunto contiene:
    codice:
    io.file.delete(path)
    Ovviamente non badate al codice che l'ho scritto al di fuori di una funzione!

    Ora c'ho (ad esempio 2) 2 checkbox:
    1 - File Temporanei - C:\Users\blabla...\Temp
    2 - File Temporanei Windows - C:\Windows\Temp

    Quindi ora ciò che voglio fare è far capire al programma quale directory pulire...
    Io ho pensato a 2 sistemi, ditemi voi quello corretto:
    1. Eseguire una specie di For Each che per ogni Checkbox presente nel formX (magari anche nel PanelX) checkata mi inserisce la determinate directory in una list*
    < Se non sbaglio si può fare!
    2. Ogni volta che checko una checkbox, questa mi inserisce e/o elimina la directory dalla list*


    * Per LIST intendo dim lista as new list(of io.directoryinfo)

    Cosa mi consigliate di fare? e cosa fareste al posto mio?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da deamon75 Visualizza il messaggio
    Ciao a tutti,
    Non so bene come spiegarmi ma ci provo...

    Io c'ho una funzione che elimina tutto i file in una specifica cartella quindi appunto contiene:
    codice:
    io.file.delete(path)
    Ovviamente non badate al codice che l'ho scritto al di fuori di una funzione!

    Ora c'ho (ad esempio 2) 2 checkbox:
    1 - File Temporanei - C:\Users\blabla...\Temp
    2 - File Temporanei Windows - C:\Windows\Temp

    Quindi ora ciò che voglio fare è far capire al programma quale directory pulire...
    Io ho pensato a 2 sistemi, ditemi voi quello corretto:
    1. Eseguire una specie di For Each che per ogni Checkbox presente nel formX (magari anche nel PanelX) checkata mi inserisce la determinate directory in una list*
    < Se non sbaglio si può fare!
    2. Ogni volta che checko una checkbox, questa mi inserisce e/o elimina la directory dalla list*


    * Per LIST intendo dim lista as new list(of io.directoryinfo)

    Cosa mi consigliate di fare? e cosa fareste al posto mio?
    Ciao.
    Entrambi i metodi sono validi..
    Per il primo puoi fare un for each C as Control in Form.controls, verifichi con un if che l'oggetto C sia una checkbox, esegui il cast se C non espone la proprietà Checked, e poi cancelli i file che ti servono.
    Nel secondo caso invece, intercetti l'evento di click sulla checkbox e tieni una lista con i dati selezionati, aggiungendo o rimuovendo gli elementi di conseguenza..
    Prova: butta giù un po' di codice e vediamo..

  3. #3
    Quote Originariamente inviata da renygade Visualizza il messaggio
    Ciao.
    Entrambi i metodi sono validi..
    Per il primo puoi fare un for each C as Control in Form.controls, verifichi con un if che l'oggetto C sia una checkbox, esegui il cast se C non espone la proprietà Checked, e poi cancelli i file che ti servono.
    Nel secondo caso invece, intercetti l'evento di click sulla checkbox e tieni una lista con i dati selezionati, aggiungendo o rimuovendo gli elementi di conseguenza..
    Prova: butta giù un po' di codice e vediamo..
    So come fare entrambi i modi, cioè ora ho provato col secondo, col primo non credo trovi difficoltà a scrivere il codice... Volevo appunto sapere qual è la soluzione più valida in termine di performance


    Il primo metodo dovrebbe essere qualcosa tipo:
    codice:
    For Each C As Control In Me.TabPage1.Controls
        If TypeOf C Is CheckBox Then
            If TryCast(C, CheckBox).Checked = True Then
                Message.Show(C.Name.ToString)
            End If
        End If
    Next
    E funziona, insomma mi restituisce solo i checked... ora invece del box devo mettere lista.add etc etc... mi consigli di utilizzare questa via?


    EDIT:
    In caso di questo metodo secondo me la cosa migliore è usare un select:
    codice:
    Select C.Name
    Case Is "Windows"
    lista.add("c:\windows")
    Case Is "Temp"
    lista.add("c:\user\temp")
    End Select
    Ovviamente non far caso a questo codice è solo un esempio, so che la sintassi è sbagliata
    Ultima modifica di deamon75; 02-12-2013 a 11:31

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da deamon75 Visualizza il messaggio
    So come fare entrambi i modi, cioè ora ho provato col secondo, col primo non credo trovi difficoltà a scrivere il codice... Volevo appunto sapere qual è la soluzione più valida in termine di performance


    Il primo metodo dovrebbe essere qualcosa tipo:
    codice:
    For Each C As Control In Me.TabPage1.Controls
        If TypeOf C Is CheckBox Then
            If TryCast(C, CheckBox).Checked = True Then
                Message.Show(C.Name.ToString)
            End If
        End If
    Next
    E funziona, insomma mi restituisce solo i checked... ora invece del box devo mettere lista.add etc etc... mi consigli di utilizzare questa via?


    EDIT:
    In caso di questo metodo secondo me la cosa migliore è usare un select:
    codice:
    Select C.Name
    Case Is "Windows"
    lista.add("c:\windows")
    Case Is "Temp"
    lista.add("c:\user\temp")
    End Select
    Ovviamente non far caso a questo codice è solo un esempio, so che la sintassi è sbagliata
    Infatti.. volevo ben dire che la sintassi non è quella
    Direi che se hai scritto il codice per la prima soluzione, usa quella. A livello di performance, non è certo il tuo codice a influire sulla velocità di esecuzione.. Semmai la funzione delete, ma quella devi usarla in ogni caso.
    Consiglio: salvati sulla proprietà tag delle checkbox il path completo, così ti eviti il select e la list. Per cancellare fai delete(cstr(C.tag)) dove C è il riferimento al tuo controllo generico, verificato che è checkbox e selezionato e hai fatto.
    Ultima modifica di renygade; 02-12-2013 a 11:40

  5. #5
    Quindi teorizzato diventa:
    1. Ciclo ogni controllo presente nel mio form (nel mio caso tabcontrol)
    2. Controllo se il "controllo" che sto processando è di tipo "CHECKBOX"
    3. Se è di tipo checkbox controllo se è "checked"
    4. Se tutto va a buon fine aggiungo la directory (contenuta nella proprietà del controllo checkbox) nella lista di directory




    in codice è:
    codice:
    For Each C As Control In Me.TabPage1.Controls
        If TypeOf C Is CheckBox Then
            If TryCast(C, CheckBox).Checked Then
                Lista.Add(New IO.DirectoryInfo(cstr(C.tag)))
            End If
        End If
    Next
    FunzioneSvuotaDirectory(Lista)

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da deamon75 Visualizza il messaggio
    Quindi teorizzato diventa:
    1. Ciclo ogni controllo presente nel mio form (nel mio caso tabcontrol)
    2. Controllo se il "controllo" che sto processando è di tipo "CHECKBOX"
    3. Se è di tipo checkbox controllo se è "checked"
    4. Se tutto va a buon fine aggiungo la directory (contenuta nella proprietà del controllo checkbox) nella lista di directory




    in codice è:
    codice:
    For Each C As Control In Me.TabPage1.Controls
        If TypeOf C Is CheckBox Then
            If TryCast(C, CheckBox).Checked Then
                Lista.Add(New IO.DirectoryInfo(cstr(C.tag)))
            End If
        End If
    Next
    FunzioneSvuotaDirectory(Lista)
    Si. direi che la logica è corretta. Implementa l'algoritmo con il codice adeguato.
    Occhio con le funzioni per cancellare file.. Sicuramente serve un bel try Catch

  7. #7
    Quote Originariamente inviata da renygade Visualizza il messaggio
    Si. direi che la logica è corretta. Implementa l'algoritmo con il codice adeguato.
    Occhio con le funzioni per cancellare file.. Sicuramente serve un bel try Catch
    Si, già feci la funzione... trovo dove ce l'ho e la posto qui....
    EDIT: Come non detto, non ricordo in che progetto sta...
    Comunque feci un qualcosa di ricorsivo dove per ogni cartella eliminava tutti i file e poi la cartella stessa, ovviamente tutto addobbato con try catch ed aggiungi una progressbar...

    In pratica è qualcosa tipo:
    for each dir as io.directoryinfo in lista
    svuota(dir)
    next

    function svuota(d As System.IO.DirectoryInfo) As List(Of IO.FileSystemInfo))
    Dim l As New List(Of IO.FileSystemInfo)
    IntFilesList(d, l)
    Return l
    end function

    sub IntFilesList(d As System.IO.DirectoryInfo, l As List(Of IO.FileSystemInfo))
    For Each fileX As IO.FileInfo In d.GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    io.file.delete(filex)
    next
    For Each dir As IO.DirectoryInfo In d.GetDirectories()
    IntFilesList(dir, l)
    next
    end sub


    Ovviamente ho scritto velocemente... quindi non far caso a parentesi virgole e/o parole saltare
    e rimarco che comunque ho soltato anche i try i quali mi sa che li ho messi un pò ovunque si possa ricevere un errore (cioè durante le eliminazioni e le enumerazioni)


    Ma meglio evitare d'andare OT
    Ultima modifica di deamon75; 02-12-2013 a 13:01

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.