Oppure

Loading
05/11/09 17:08
Daniele93
Buona sera a tutti. Ho riscontrato un problema pratico in un programma che sto realizzando e che permette di gestire ,per adesso nomi e cognomi, ripescandoli da una directory attraverso nomi di cartelle (Composte da 'CognomeNome') e inserendoli in una listbox. è anche possibile riceracre la persona desiderata attravero un campo di ricerca... Ecco il problema quando pesco le cartelle dalla directory "C:\Lavoro" non ottengo il nome della cartella ma bensì il percorso completo. Ecco che nasce la domanda,ovvero, come faccio a togliere il percorso che mi si aggiunge automaticamente?

Lo sò che state pensando: Xkè diavolo non usa un DB? se deve pure fare le ricerche!

Non so se ci sia una risposta precisa ma ci sono molti motivi... Comunque aspetto vostre risposte grazie!


'Codice che effetua la ricerca
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim cont As Integer
        Dim sai As String
        ListBox1.Items.Clear()
        cartelle = System.IO.Directory.GetDirectories("C:\Lavoro").ToArray
        For Each bo As String In cartelle
            sai = cartelle(cont).ToString()
            If sai = TextBox1.Text Then
                ListBox1.Items.Add(sai)
                cont = cont + 1
            Else
                cont = cont + 1
            End If
        Next

    End Sub
Ultima modifica effettuata da Daniele93 05/11/09 17:15
aaa
05/11/09 18:43
lorenzo
beh, se la directory è sempre C:\Lavoro potresti estrarre dal path completo una sottostringa a partire dalla posizione della seconda / presente da sinistra

se può cambiare allora, parti da destra ed estrai come sottostringa fino a che non incontri la prima occorrenza della / andando a sinistra

ps: magari esiste una funzioe apposita...io conosco solo Path.GetFileName ma serve solo per il file, non per le directory
aaa
05/11/09 19:01
Daniele93
Per adesso durante le prove del programma e la stesura delle basi usavo String.Remuve poi provero i metodi consigliati da tè... anche perchè la directory cambia.

Grazie dell' aiuto!

Adesso è sorto un' altro problema...

Prima analizzavo solo le cartelle all' interno di UNA cartella (Lavoro) ma ora sono a un punto in cui devo analizzare tutti i file all' interno di tutte le sottocartelle. Ad esempio: Analizzo i file di: "C:\Lavoro\MarioRossi" poi di "C:\Lavoro\LucaBianchi", ecc...

Io avevo pensato di creare un' array che contenesse le cartelle e uno che per ogni cartella contenuta mi controllasse il file desiderato e se trovasse corrispondenza con i criteri di ricerca lo scrivesse nella listbox, il codice è piu o meno simile a quallo precedente ma cosa devo mettere come tipo?

For Each ... In CartelArray


Cosa metto al posto dei puntini?

Grazie ancora!

P.S. se devo aprire un nuovo topic ditemelo...
Ultima modifica effettuata da Daniele93 05/11/09 19:02
aaa
06/11/09 16:24
noitide
Imports System.IO

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ListBox1.Items.Clear()
        For Each bo As String In Directory.GetDirectories("C:\Lavoro")
           dim info as new Directoryinfo(bo)
           listbox1.items.add(info.name)
        Next
    End Sub

usando directory info si può ottenere comodamente il nome della directory.

poi questo pezzo:
 sai = cartelle(cont).ToString()
            If sai = TextBox1.Text Then
                ListBox1.Items.Add(sai)
                cont = cont + 1
            Else
                cont = cont + 1
            End If

l'ho tralasciato xk non capivo a cosa serve.. sembrerebbe ke confronti la lista di cartelle con una textbox e poi c'è un contatore (la variabile cont) ke probabilmente andrà a riempire una label..
è così?
aaa
06/11/09 16:50
Daniele93
Grazie, ma il codice non trova le informazioni della cartella? a me serve che prenda tutte le cartelle per ogni cartella controllare i file e per ogni file leggerene il contenuto e se corrispondente alla ricerca scriverlo.

Qualcosa ho steso da solo, ma adesso è nato un' altro problema, cioè che mi dice che ho un indice di vettore che non esiste (L' errore è: Indice oltre i limiti della matrice.) quando invece dovrebbe esserci:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim file As Array
        Dim cont As Integer
        Dim valore As String
        Dim cartelle As Array
        cont = 0
        cartelle = System.IO.Directory.GetDirectories("C:\Lavoro").ToArray
        For Each path As String In cartelle
            file = System.IO.Directory.GetFiles(cartelle(cont)).ToArray
            For Each boe As String In file
                valore = My.Computer.FileSystem.ReadAllText(file(cont))
                If TextBox1.Text = valore Then
                    ListBox1.Items.Add(valore) 
                    cont = cont + 1
                Else
                    cont = cont + 1
                End If
            Next
        Next
    End Sub


Praticamente secondo lui file = System.io.directory.getdirectory("C:\Lavoro";).ToArray non produce array! perchè nemmeno con indice 1 me lo trova! Eppure ho usato lo stesso codice in altre form e anche nel cosice postato prima! Qualcuno sà dirmi dov' è l'errore? Io dopo 4ore non l' ho ancora trovato! Magari è sciocchissimo...
Ultima modifica effettuata da Daniele93 06/11/09 16:51
aaa
06/11/09 19:14
Il Totem
Per prima cosa, non si dichiara mai un array come di tipo Array, perchè Array è una classe astratta e non ha questo scopo. Se non sai di che tipo dichiarare un array, userai Object, ma credo che questo capito raramente. Comunque un array si dichiara con:
Dim [Nome]() As [Tipo]

Poi, GetFiles e GetDirectories restituiscono un array: perchè mai lo converti ancora in array? E' dannoso leggere almeno le signature o le descrizioni dei metodi? Entrambi restituiscono un array di stringhe, quindi il codice corretto è:
Dim Files() As String = IO.Directory.GetFiles("...")

E poi per quale motivo usi un For Each se poi te ne freghi altamente della variabile contatore? E' anche inutile usare cont perchè path contiene di volta in volta il nome delle cartelle e boe quello dei files.
Inoltre IO.Path.GetFileName funziona anche con i nomi delle cartelle.

L'errore deriva ovviamente dal fatto che usi uno stesso contatore per due array diversi, cosa che potresti benissimo evitare dato che usi dei for each.

Ma dove hai imparato quello stile di coding?
aaa
06/11/09 19:45
noitide
allora questo è il codice ke ho modificato e così funziona.
ListBox1.Items.Clear()
        Dim totale As New ArrayList
        totale.Clear()
        Dim valore As String
        For Each c As String In System.IO.Directory.GetDirectories("C:\Users\Davide\Desktop", "*", IO.SearchOption.AllDirectories)
            For Each file In System.IO.Directory.GetFiles(c, "*", IO.SearchOption.AllDirectories)
                Dim nome As New FileInfo(file)
                Dim leggi As New StreamReader(file)
                valore = leggi.ReadToEnd
                If valore.Contains(TextBox1.Text) = True Then
                    ListBox1.Items.Add(nome.Name)
                    totale.Add(1)
                End If
            Next
        Next
        If totale.Count = 0 Then
            MsgBox("Non è stato trovato nulla secondo i criteri di ricerca")
        End If

allora rispetto al tuo codice ci sono passaggi in meno e cose tolte xk inutili.
guardalo ke ti ho commentato cosa ho modificato/tolto.
Postato originariamente da Daniele93:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim file As Array   ' queste variabili sono inutili in quanto si può mettere direttamente System.io.directory. etc xk restituisce un array
        Dim cont As Integer
        Dim valore As String
        Dim cartelle As Array
        cont = 0
        cartelle = System.IO.Directory.GetDirectories("C:\Lavoro").ToArray  ' qui il toarray è inutile xk restituisce già un array (di stringhe in questo caso)
        For Each path As String In cartelle
            file = System.IO.Directory.GetFiles(cartelle(cont)).ToArray  ' x quanto riguarda il toarray il commento è lo stesso di sopra.
            For Each boe As String In file
                valore = My.Computer.FileSystem.ReadAllText(file(cont)) 'qui tu usi l'indice di array per ricavare il file, ma è sbagliato xk ReadAllText vuole il percorso del file.
                If TextBox1.Text = valore Then  'così facendo tu paragoni tutta una stringa ke può essere composta da "ciao gatto prova oca" con quello ke c'è scritto in textbox ke poniamo sia "prova", logicamente il vb ti dice ke "ciao gatto prova oca" non è uguale a "prova", quindi devi usare uno streamreader e il parametro contains
                    ListBox1.Items.Add(valore) 
                    cont = cont + 1
                Else
                    cont = cont + 1
                End If
            Next
        Next
    End Sub


spero di essere stato chiaro e utile..;)

EDIT: mi scuso con Totem per aver detto le stesse sue cose.. ma mentre lui scriveva io stavo scrivendo il mio post..
Ultima modifica effettuata da noitide 06/11/09 19:48
aaa
07/11/09 14:04
Daniele93
Per prima cosa grazie a tutti e due! Secondo, ho provato e il codice e funziona, e sono riuscito a capirlo... Mi sono permesso una modifica che scrive il nome della cartella e non il nome del file, mi scuso se avevo chiesto questo, ma dinuovo con il percorso intero ma il problema lo risolvero ancora con remuve(0, 10)...

Il mio modo di scrivere il codice (Almeno credo che coding significhi questo) purtroppo non l' ho imparato da nessuno... Sono autodidatta e solo da 2 mesi facciamo un pò di stesura di codice a scuola e magari mi affinerò lì... Hai ragione comunque! Sono molto confusionario e ho le idee poco chiare sugli array perchè è la 2° volta che li uso dopo gli esercizi... E poi per quanto rigurda il contatore è una mania... Anche se qui serviva (Secondo il mio sbagliato ragionamento) per incrementare l' indice che veniva usato...

Comunque Grazie a tutti del prezioso aiuto!
Ultima modifica effettuata da Daniele93 07/11/09 14:06
aaa