Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Togliere i suffissi
Forum - C# / VB.NET - Togliere i suffissi

Avatar
Daniele93 (Normal User)
Expert


Messaggi: 226
Iscritto: 29/05/2009

Segnala al moderatore
Postato alle 18:08
Giovedì, 05/11/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

  1. 'Codice che effetua la ricerca
  2. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  3.         Dim cont As Integer
  4.         Dim sai As String
  5.         ListBox1.Items.Clear()
  6.         cartelle = System.IO.Directory.GetDirectories("C:\Lavoro").ToArray
  7.         For Each bo As String In cartelle
  8.             sai = cartelle(cont).ToString()
  9.             If sai = TextBox1.Text Then
  10.                 ListBox1.Items.Add(sai)
  11.                 cont = cont + 1
  12.             Else
  13.                 cont = cont + 1
  14.             End If
  15.         Next
  16.  
  17.     End Sub


Ultima modifica effettuata da Daniele93 il 05/11/2009 alle 18:15
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 19:43
Giovedì, 05/11/2009
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

PM Quote
Avatar
Daniele93 (Normal User)
Expert


Messaggi: 226
Iscritto: 29/05/2009

Segnala al moderatore
Postato alle 20:01
Giovedì, 05/11/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

  1. 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
PM Quote
Avatar
noitide (Normal User)
Pro


Messaggi: 107
Iscritto: 24/06/2009

Segnala al moderatore
Postato alle 17:24
Venerdì, 06/11/2009
Codice sorgente - presumibilmente VB.NET

  1. Imports System.IO
  2.  
  3. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  4.         ListBox1.Items.Clear()
  5.         For Each bo As String In Directory.GetDirectories("C:\Lavoro")
  6.            dim info as new Directoryinfo(bo)
  7.            listbox1.items.add(info.name)
  8.         Next
  9.     End Sub


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

poi questo pezzo:
Codice sorgente - presumibilmente Delphi

  1. sai = cartelle(cont).ToString()
  2.             If sai = TextBox1.Text Then
  3.                 ListBox1.Items.Add(sai)
  4.                 cont = cont + 1
  5.             Else
  6.                 cont = cont + 1
  7.             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ì?

PM Quote
Avatar
Daniele93 (Normal User)
Expert


Messaggi: 226
Iscritto: 29/05/2009

Segnala al moderatore
Postato alle 17:50
Venerdì, 06/11/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

  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         Dim file As Array
  3.         Dim cont As Integer
  4.         Dim valore As String
  5.         Dim cartelle As Array
  6.         cont = 0
  7.         cartelle = System.IO.Directory.GetDirectories("C:\Lavoro").ToArray
  8.         For Each path As String In cartelle
  9.             file = System.IO.Directory.GetFiles(cartelle(cont)).ToArray
  10.             For Each boe As String In file
  11.                 valore = My.Computer.FileSystem.ReadAllText(file(cont))
  12.                 If TextBox1.Text = valore Then
  13.                     ListBox1.Items.Add(valore)
  14.                     cont = cont + 1
  15.                 Else
  16.                     cont = cont + 1
  17.                 End If
  18.             Next
  19.         Next
  20.     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
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 20:14
Venerdì, 06/11/2009
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

  1. 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 è:
Codice sorgente - presumibilmente C# / VB.NET

  1. 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?

PM Quote
Avatar
noitide (Normal User)
Pro


Messaggi: 107
Iscritto: 24/06/2009

Segnala al moderatore
Postato alle 20:45
Venerdì, 06/11/2009
allora questo è il codice ke ho modificato e così funziona.
Codice sorgente - presumibilmente VB.NET

  1. ListBox1.Items.Clear()
  2.         Dim totale As New ArrayList
  3.         totale.Clear()
  4.         Dim valore As String
  5.         For Each c As String In System.IO.Directory.GetDirectories("C:\Users\Davide\Desktop", "*", IO.SearchOption.AllDirectories)
  6.             For Each file In System.IO.Directory.GetFiles(c, "*", IO.SearchOption.AllDirectories)
  7.                 Dim nome As New FileInfo(file)
  8.                 Dim leggi As New StreamReader(file)
  9.                 valore = leggi.ReadToEnd
  10.                 If valore.Contains(TextBox1.Text) = True Then
  11.                     ListBox1.Items.Add(nome.Name)
  12.                     totale.Add(1)
  13.                 End If
  14.             Next
  15.         Next
  16.         If totale.Count = 0 Then
  17.             MsgBox("Non è stato trovato nulla secondo i criteri di ricerca")
  18.         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.
Testo quotato

Postato originariamente da Daniele93:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         Dim file As Array   ' queste variabili sono inutili in quanto si può mettere direttamente System.io.directory. etc xk restituisce un array
  3.         Dim cont As Integer
  4.         Dim valore As String
  5.         Dim cartelle As Array
  6.         cont = 0
  7.         cartelle = System.IO.Directory.GetDirectories("C:\Lavoro").ToArray  ' qui il toarray è inutile xk restituisce già un array (di stringhe in questo caso)
  8.         For Each path As String In cartelle
  9.             file = System.IO.Directory.GetFiles(cartelle(cont)).ToArray  ' x quanto riguarda il toarray il commento è lo stesso di sopra.
  10.             For Each boe As String In file
  11.                 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.
  12.                 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
  13.                     ListBox1.Items.Add(valore)
  14.                     cont = cont + 1
  15.                 Else
  16.                     cont = cont + 1
  17.                 End If
  18.             Next
  19.         Next
  20.     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
PM Quote
Avatar
Daniele93 (Normal User)
Expert


Messaggi: 226
Iscritto: 29/05/2009

Segnala al moderatore
Postato alle 15:04
Sabato, 07/11/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
PM Quote