Daniele93 (Normal User)
Expert
Messaggi: 226
Iscritto: 29/05/2009
|
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 sorgente - presumibilmente VB.NET |
'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 il 05/11/2009 alle 18:15 |
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
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
|
|
Daniele93 (Normal User)
Expert
Messaggi: 226
Iscritto: 29/05/2009
|
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?
Codice sorgente - presumibilmente C# / VB.NET |
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 il 05/11/2009 alle 20:02 |
|
noitide (Normal User)
Pro
Messaggi: 107
Iscritto: 24/06/2009
|
Codice sorgente - presumibilmente VB.NET |
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:
Codice sorgente - presumibilmente Delphi |
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ì? |
|
Daniele93 (Normal User)
Expert
Messaggi: 226
Iscritto: 29/05/2009
|
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:
Codice sorgente - presumibilmente VB.NET |
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 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 il 06/11/2009 alle 17:51 |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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:
Codice sorgente - presumibilmente C# / VB.NET |
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 è:
Codice sorgente - presumibilmente C# / VB.NET |
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?
|
|
noitide (Normal User)
Pro
Messaggi: 107
Iscritto: 24/06/2009
|
allora questo è il codice ke ho modificato e così funziona.
Codice sorgente - presumibilmente VB.NET |
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:
Codice sorgente - presumibilmente VB.NET |
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 il 06/11/2009 alle 20:48 |
|
Daniele93 (Normal User)
Expert
Messaggi: 226
Iscritto: 29/05/2009
|
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 il 07/11/2009 alle 15:06 |
|