none
ELIMINARE LISTA RRS feed

  • Domanda

  • Come nascondo i file di sistema dalla lista Listbox?

    Come evito che nella listbox vengano visualizzati file o cartelle di sistema?

    Ecco il mio attuale codice:

    Imports System.IO
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Label1.Text = ""
            Label2.Text = ""
            Label3.Text = ""
            Label4.Text = ""
        End Sub
        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    
            'Manca controllo cartella ed apertura cartella -> se ho selezionato una cartella apre path della cartella visualizzando contenuto in lista.
    
            'Process.Start(My.Application.Info.DirectoryPath & listBox1.Text) -> Non legge la selezione listbox (dovrebbe avviare il file secondo specifiche default di sistema)!!
    
            Dim selectedItem As Object
            selectedItem = ListBox1.SelectedItem
            Process.Start(My.Application.Info.DirectoryPath & selectedItem)
    
        End Sub
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            ListBox1.Items.Clear()
            ListBox1.Text = ""
    
    
            '---
            If Directory.Exists(TextBox1.Text) Then GoTo 1 Else GoTo 0
    0:
            Label1.Text = "Non esiste, lista non creata!" : Exit Sub
    1:
            Label1.Text = "Creo lista!"
            '---
    
    
    
            ' Listbox
            Dim directoryInfo = New IO.DirectoryInfo(TextBox1.Text)
            Dim Files As String() = directoryInfo.EnumerateFileSystemInfos() _
            .Select(Function(info) info.Name) _
            .ToArray()
    
            ListBox1.Items.AddRange(Files)
            ' Fine Listbox
    
            If Label5.Text = "1" Then If Label2.Text = TextBox1.Text Then GoTo FINE
            If Label5.Text = "2" Then GoTo S3
            If Label5.Text = "3" Then GoTo S3
    
            If Label2.Text <> "" Then GoTo R2
            If Label5.Text = "1" Then Label2.Text = TextBox1.Text
            GoTo FINE
    R2:
            Label5.Text = "2"
            Label3.Text = TextBox1.Text
            GoTo FINE
    
    S3:
            If Label3.Text = TextBox1.Text Then GoTo FINE
            Label5.Text = "3"
            If Label4.Text <> "" Then GoTo R3
    
            If Label5.Text = "3" Then Label4.Text = TextBox1.Text
            GoTo FINE
    R3:
            Label5.Text = "3"
            Label4.Text = TextBox1.Text
    
    
    FINE:
            'Fine!
            Label1.Text = "Fatto, lista pronta"
    
    
    
        End Sub
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Application.Exit()
        End Sub
        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
            If Label5.Text = "1" Then GoTo FINE
            '--
            If Label5.Text = "2" Then TextBox1.Text = Label2.Text Else GoTo 2
            Label5.Text = "1" : Exit Sub
            '--
    2:
            If Label5.Text = "3" Then TextBox1.Text = Label3.Text
            Label5.Text = "2" : Exit Sub
    FINE:
        End Sub
        Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
            If Label5.Text = "3" Then GoTo FINE
            '--
            If Label5.Text = "1" Then TextBox1.Text = Label3.Text Else GoTo 2
            Label5.Text = "2" : Exit Sub
            '--
    2:
            If Label5.Text = "2" Then TextBox1.Text = Label4.Text
            Label5.Text = "3" : Exit Sub
    FINE:
        End Sub
    End Class

    Il codice interessato è

            ' Listbox
            Dim directoryInfo = New IO.DirectoryInfo(TextBox1.Text)
            Dim Files As String() = directoryInfo.EnumerateFileSystemInfos() _
            .Select(Function(info) info.Name) _
            .ToArray()
    
            ListBox1.Items.AddRange(Files)
            ' Fine Listbox









    • Modificato _F_ mercoledì 29 agosto 2018 09:34
    martedì 28 agosto 2018 13:15

Tutte le risposte

  • Ciao,
    ti basta aggiungere l'extension method Where all'espressione LINQ che hai già. In questo modo potrai escludere i risultati indesiderati.

    Dim Files As String() = directoryInfo.EnumerateFileSystemInfos() _
              .Where(Function(info) Not info.Attributes.HasFlag(IO.FileAttributes.System)) _
              .Select(Function(info) info.Name) _
              .ToArray()

    Il predicato che ho passato come argomento all'extension method Where serve ad escludere dalla lista i file che hanno l'attributo System.

    Dovresti studiare LINQ perché è uno strumento molto potente. Inizia da qui:
    https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/concepts/linq/introduction-to-linq

    Ma sul lungo periodo ti consiglio di seguire un libro o di partecipare a un corso. In questo modo potrai apprendere il linguaggio in maniera più strutturata ed evitare così di restare bloccato su problemi base.

    ciao,
    Moreno

    • Contrassegnato come risposta _F_ mercoledì 29 agosto 2018 10:59
    • Contrassegno come risposta annullato _F_ mercoledì 29 agosto 2018 11:18
    mercoledì 29 agosto 2018 10:38
  • Grazie ora la provo ma prima di provarla ti vorrei dire che da molto cerco libri in merito ma li trovo o troppo basilari oppure guide in internet complicate da seguire con termini incomprensibili.

    Al momento possiedo (I PORTATILI) Microsoft Visual Basic 2010 GUIDA PRATICA (MICHAEL HALVORSON)

    Ma è di poco aiuto.

    Tra poco ti farò sapere se il codice funziona!

    Mi dispiace informarti che funziona solo in alcuni casi ti posto l'intero codice.

    Per nascondere i file va bene ma non opera con le cartelle.

    Imports System.IO
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' Avvio (Ci vedo)
            Panel1.Visible = True
            Label1.Text = ""
            Label2.Text = ""
            Label3.Text = ""
            Label4.Text = ""
        End Sub
        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click ' Apri
            If ListBox1.SelectedItem = "" Then Exit Sub
            ' Verifica se è una cartella. Ed aggiunge "\" all'indirizzo.
            If Directory.Exists(TextBox1.Text & ListBox1.SelectedItem) Then TextBox1.Text = TextBox1.Text & ListBox1.SelectedItem & "\" : Exit Sub
            '--
            Dim S As Object
            S = CreateObject("Shell.Application")
            S.ShellExecute(TextBox1.Text & ListBox1.SelectedItem)
            Application.Exit()
        End Sub
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' Visualizza
            ListBox1.Items.Clear()
            ListBox1.Text = ""
            Label1.Text = ""
            '---
            If Directory.Exists(TextBox1.Text) Then GoTo 1 Else GoTo 0
    0:
            Label1.Text = "Non esiste, lista non creata!" : Exit Sub
    1:
            Label1.Text = "Creo lista!" ' Non viene visualizzato!?
            'Controlla indirizzo se esiste in Label.
            If TextBox1.Text = Label2.Text Then TextBox1.Text = Label2.Text : Label5.Text = "1" : GoTo via
            If TextBox1.Text = Label3.Text Then TextBox1.Text = Label3.Text : Label5.Text = "2" : GoTo via
            If TextBox1.Text = Label4.Text Then TextBox1.Text = Label4.Text : Label5.Text = "3" : GoTo via
    via:
            'Fine controllo.
            ' Listbox
            Dim directoryInfo = New IO.DirectoryInfo(TextBox1.Text)
            Dim Files As String() = directoryInfo.EnumerateFileSystemInfos() _
            .Where(Function(info) Not info.Attributes.HasFlag(IO.FileAttributes.System)) _
            .Select(Function(info) info.Name) _
            .ToArray()
            ListBox1.Items.AddRange(Files)
            ' Fine Listbox
            '---
            If Label5.Text = "1" Then If Label2.Text = TextBox1.Text Then GoTo FINE
            If Label5.Text = "2" Then GoTo S3
            If Label5.Text = "3" Then GoTo S3
            '-
            If Label2.Text <> "" Then GoTo R2
            If Label5.Text = "1" Then Label2.Text = TextBox1.Text
            GoTo FINE
    R2:
            Label5.Text = "2"
            Label3.Text = TextBox1.Text
            GoTo FINE
            '-
    S3:
            If Label3.Text = TextBox1.Text Then GoTo FINE
    
            Label5.Text = "3"
    
            If Label4.Text <> "" Then GoTo R3
            '-
            If Label5.Text = "3" Then Label4.Text = TextBox1.Text
            GoTo FINE
    R3:
            Label5.Text = "3"
            Label4.Text = TextBox1.Text
            '---
    FINE:
            'Fine!
            '--- Recenti      /// Evitare doppioni !
    
    
            '---
            Dim Recenti As String
            Recenti = TextBox1.Text
            ListBox2.Items.Add(Recenti)
            '---
            Label1.Text = "Fatto, lista pronta!"
        End Sub
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click ' Esci
            Application.Exit()
        End Sub
        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click ' Dietro
            If Label5.Text = "1" Then GoTo FINE
            '--
            If Label5.Text = "2" Then TextBox1.Text = Label2.Text Else GoTo 2
            Label5.Text = "1" : Exit Sub
            '--
    2:
            If Label5.Text = "3" Then TextBox1.Text = Label3.Text
            Label5.Text = "2" : Exit Sub
    FINE:
        End Sub
        Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click ' Avanti
            If Label5.Text = "3" Then GoTo FINE
            '--
            If Label3.Text = "" Then Exit Sub
            If Label5.Text = "1" Then TextBox1.Text = Label3.Text Else GoTo 2
            Label5.Text = "2" : Exit Sub
            '--
    2:
            If Label4.Text = "" Then Exit Sub
            If Label5.Text = "2" Then TextBox1.Text = Label4.Text
            Label5.Text = "3" : Exit Sub
    FINE:
        End Sub
        Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click '  Seleziona recente
            TextBox1.Text = ListBox2.SelectedItem
        End Sub
    
        Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
            panel2.visible = True
        End Sub
    
        Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
            ListBox1.Font = New Font(Font.FontFamily, TextBox2.Text)
        End Sub
    
        Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
            Panel2.Visible = False
        End Sub
    End Class

    Si blocca perché non può aprire cartelle o file protetti, qualcosa viene ancora mostrato e vorrei evitare che succeda questo:

    Errore : System.UnauthorizedAccessException: 'Accesso al percorso 'c:\MSOCache' negato.'

    Come dimostrazione ti invio questa immagine




    • Modificato _F_ mercoledì 29 agosto 2018 11:28
    mercoledì 29 agosto 2018 10:55
  • Ok, quindi tu non vuoi escludere SOLO file e directory di sistema, ma vuoi escludere anche quelli inaccessibili dall'utente. Non sono gli stessi, infatti una directory (o un file) può risultare inaccessibile all'utente anche se non è di sistema (cioè se non ha l'attributo System).

    Abbiamo già visto la Where che esclude file e directory di sistema, e ora aggiungiamo anche quella che esclude file e directory inaccessibili.

    Dim Files As String() = directoryInfo.EnumerateFileSystemInfos() _
      .Where(Function(info) Not info.Attributes.HasFlag(IO.FileAttributes.System)) _
      .Where(Function(info)
                 Try
                     IO.Directory.GetAccessControl(info.FullName)
                     Return True
                 Catch
                     Return False
                 End Try
             End Function) _
    .Select(Function(info) info.Name) _
    .ToArray()

    Possiamo determinare se una directory (o un file) è accessibile grazie al metodo System.IO.Directory.GetAccessControl. L'invocazione al metodo solleverà un'eccezione se l'utente non possiede i privilegi di accesso e quindi è necessario avvolgere l'istruzione con un Try Catch.

    Se l'invocazione ha successo, restituiamo True ad indicare che vogliamo mantenere la directory (o il file) nell'elenco. Se invece l'invocazione produce un'eccezione, allora restituiamo False.

    Verifica qui, sulla documentazione, se questa tecnica fa al caso tuo. In particolare, verranno escluse sia le directory (e i file) non accessibili e quelli in sola lettura.

    Poi, a proposito di quello che dicevo prima...

    Al momento possiedo (I PORTATILI) Microsoft Visual Basic 2010 GUIDA PRATICA (MICHAEL HALVORSON)
    Ma è di poco aiuto.

    Come mai? Scrivo anch'io quindi mi farebbe piacere sapere come preferiresti che venisse scritto il libro (o quali caratteristiche dovrebbe avere affinché sia d'aiuto per te).

    Ciao,
    Moreno



    mercoledì 29 agosto 2018 12:44
  • Perdonami ma sono andato in tilt!

    Il tuo codice postato per ultimo sostituisce l'altro , ingloba sia (di sistema) e (protetto)?

    Come dovrebbe essere il mio codice completo?

         ' Listbox
            Dim directoryInfo = New IO.DirectoryInfo(TextBox1.Text)
            Dim Files As String() = directoryInfo.EnumerateFileSystemInfos() _
            .Where(Function(info) Not info.Attributes.HasFlag(IO.FileAttributes.System)) _
            .Select(Function(info) info.Name) _
            .ToArray()
            ListBox1.Items.AddRange(Files)
            ' Fine Listbox


    ' Listbox Dim directoryInfo = New IO.DirectoryInfo(TextBox1.Text) Dim Files As String() = directoryInfo.EnumerateFileSystemInfos() _ .Where(Function(info) Not info.Attributes.HasFlag(IO.FileAttributes.System)) _ 'nuovo
      .Where(Function(info)
                 Try
                     IO.Directory.GetAccessControl(info.FullName)
                     Return True
                 Catch
                     Return False
                 End Try
             End Function) _ 'fine nuovo .Select(Function(info) info.Name) _ .ToArray() ListBox1.Items.AddRange(Files) ' Fine Listbox

    Questo codice sotto funziona ma non sono sicuro che sia corretto al 100% puoi dargli un'occhiata?

           ' Listbox
            Dim directoryInfo = New IO.DirectoryInfo(TextBox1.Text)
            Dim Files As String() = directoryInfo.EnumerateFileSystemInfos() _
            .Where(Function(info) Not info.Attributes.HasFlag(IO.FileAttributes.System)) _
            .Where(Function(info)
                       Try
                           IO.Directory.GetAccessControl(info.FullName)
                           Return True
                       Catch
                           Return False
                       End Try
                   End Function) _
            .Select(Function(info) info.Name) _
            .ToArray()
            ListBox1.Items.AddRange(Files)
            ' Fine Listbox
    Se hai tempo potresti visitare (www.lbdp-gioco.simplesite.com)




    • Modificato _F_ mercoledì 29 agosto 2018 13:35
    mercoledì 29 agosto 2018 13:21
  • Sì, il codice è ok.
    mercoledì 29 agosto 2018 15:15