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 - Perché non riesco a leggere un file.txt?
Forum - C# / VB.NET - Perché non riesco a leggere un file.txt?

Avatar
alpi39 (Normal User)
Pro


Messaggi: 63
Iscritto: 07/03/2008

Segnala al moderatore
Postato alle 17:26
Domenica, 24/08/2008
Questo topic è stato chiuso dal moderatore

Buongiorno a tutti gli iscritti al Forum ed a Totem in testa a tutti.
Il mio problema di oggi è questo:
Ho registrato, in un calendario, tanti file di testo per quanti sono i giorni dell'anno.
Ogni file è situato all'interno di una cartella che ha, come titolo, il giorno ed il mese corrispondente.
Queste cartelle sono contenute, in numero uguale ai giorni di ogni mese, dentro una cartella che ha per nome, il mese che le contiene.
Es.
Gennaio contiene 31 cartelle una per ogni giorno.
Febbraio contiene 28 o 29 cartelle a seconda se è o no un anno bisestile e una per ogni giorno.
Marzo contiene 31 cartelle una per ogni giorno.
E così via fino  a Dicembre.
Ora, ho attivato un'altra Form con due TextBox. una per inserire la data che io desidero controllare e, l'altra dove dovrebbe apparire il testo contenuto nel file.txt relativo al giorno di quella data.
Allego il listato di questa Form.
Ho copiato integralmente, per la lettura del file, il codice riportato alla  pag. 30 della guida di Piero Tofy, per leggere un file di testo, ma alla riga:
____________________________________________________
Dim r As New IO.StreamReader("C:\Anno\Mese\Giorno\Giorno.txt")
___________________________________________________-
mi da questo errore evidenziando la riga con un fondino giallo ed una finestra che recita:
DirectoryNotFoundException non è stata gestita
e di seguito:

"Impossibile trovare una parte del percorso 'C:\Anno\Mese\Giorno\Giorno.txt' ".

dove Anno è 2009
Mese è Gennaio
Giorno è 5 Gennaio
e Giorno.txt è 5 Gennaio

Inspiegabile (per me) l'errore segnalato perché il percorso è giusto ed esatto

Codice sorgente - presumibilmente VB.NET

  1. ImportsSystem.IO
  2. ______________________________________________________
  3. Public Class Form3
  4.     Public Data As String = ""
  5.     Public Giorno As String = ""
  6.     Public Mese As String = ""
  7.     Public Anno As String
  8. ___________________________________________________
  9.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  10.  
  11.  
  12.         Dim NumTextBox As Integer = 2
  13.         Dim TextBox(NumTextBox)
  14.  
  15.  
  16.         For Each MyControl In Me.Controls
  17.             If MyControl.Name = ("TextBox" & (1)) Then
  18.  
  19.                 MyControl.Text = Mid$((Date.Now), 1, 10)
  20.  
  21.             End If
  22.         Next
  23.  
  24.     End Sub
  25. ___________________________________________________
  26.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  27.  
  28.         Dim RecordLine As String = ""
  29.         Dim NumTextBox As Integer = 2
  30.         Dim TextBox(NumTextBox)
  31.         Dim MyControl As Control = Nothing
  32.         Dim Mesi(12) As String
  33.         Dim Giorni(12) As String 'Sono la quantità dei Giorni che hanno i Mesi
  34.         Dim GiornoDellaSettimana(7) As String
  35.         Dim I As Integer
  36.         Dim G As Integer
  37.         Dim M As Integer
  38.  
  39.         'Legge la data inserita nella TextBox N°1
  40.         For Each MyControl In Me.Controls
  41.             If MyControl.Name = ("TextBox" & (1)) Then
  42.                 Data = Me.Controls("TextBox" & 1).Text
  43.             End If
  44.         Next
  45.  
  46.         'controlla che la data sia stata digitata correttamente
  47.         If Len(Data) <> 10 Then
  48.             Dim messaggio As String = MsgBox("Inserire la Data correttamente con GG/MM/AAAA")
  49.             Data = ""
  50.             Return
  51.         End If
  52.  
  53.         'controlla che non siano state digitate lettere
  54.         For I = 1 To Len(Data)
  55.             If Asc(Mid$(Data, I, 1)) < 47 Or Asc(Mid$(Data, I, 1)) > 59 Then
  56.                 Dim messaggio As String = MsgBox("Inserire la Data correttamente con GG/MM/AAAA")
  57.                 Data = ""
  58.                 Return
  59.             End If
  60.         Next
  61.  
  62.         Giorno = Mid$(Data, 1, 2)
  63.         Mese = Mid$(Data, 4, 2)
  64.         Anno = Mid$(Data, 7, 4)
  65.  
  66.         'assegna i valori a Mesi e ad ogni Mese la quantità relativa di Giorni
  67.         For I = 1 To 12
  68.             If I = 1 Then Mesi(I) = "Gennaio" : Giorni(I) = 31
  69.             If I = 2 Then Mesi(I) = "Febbraio" : Giorni(I) = 28
  70.             If I = 3 Then Mesi(I) = "Marzo" : Giorni(I) = 31
  71.             If I = 4 Then Mesi(I) = "Aprile" : Giorni(I) = 30
  72.             If I = 5 Then Mesi(I) = "Maggio" : Giorni(I) = 31
  73.             If I = 6 Then Mesi(I) = "Giugno" : Giorni(I) = 30
  74.             If I = 7 Then Mesi(I) = "Luglio" : Giorni(I) = 31
  75.             If I = 8 Then Mesi(I) = "Agosto" : Giorni(I) = 31
  76.             If I = 9 Then Mesi(I) = "Settembre" : Giorni(I) = 30
  77.             If I = 10 Then Mesi(I) = "Ottobre" : Giorni(I) = 31
  78.             If I = 11 Then Mesi(I) = "Novembre" : Giorni(I) = 30
  79.             If I = 12 Then Mesi(I) = "Dicembre" : Giorni(I) = 31
  80.         Next I
  81.  
  82.         'Forma la stinga Giorno Per andare a leggere il file di quel giorno
  83.         G = Val(Giorno)
  84.         M = Val(Mese) : Mese = Mesi(M)
  85.         Giorno = Str(G) + " " + Mese
  86.         Anno = Val(Anno)
  87.  
  88.         'Legge il file C:\Giorno.txt
  89.         Dim r As New IO.StreamReader("C:\Anno\Mese\Giorno\Giorno.txt")
  90.  
  91.         'Fintanto che non si è raggiunta la fine del file...
  92.         While Not r.EndOfStream
  93.             'Si aggiunge la nuova linea letta al testo di una textbox
  94.             TextBox2.Text += r.ReadLine
  95.         End While
  96.  
  97.         'Finita l'operazione di lettura, si chiude il file
  98.         r.Close()
  99.     End Sub
  100. _____________________________________________________
  101.     Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
  102.         Close()
  103.     End Sub
  104. End Class
  105. _____________________________________________________



Qualcuno può aiutarmi a risolvere questo mio problema?
Infiniti ringraziamenti.
alpi39 (Alberto)

Ultima modifica effettuata da alpi39 il 24/08/2008 alle 17:44
PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 18:49
Domenica, 24/08/2008
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim r As New IO.StreamReader(@"C:\Anno\Mese\Giorno\Giorno.txt")



Hai dimenticato la chiocciola davanti alla stringa... senza di quella i backslashes vengono interpretati come caratteri diversi in base alla lettera che li succede. (Ad esempio \n è il carattere per il New line, \r è il carriage Return e così via).

Ultima modifica effettuata da pierotofy il 24/08/2008 alle 18:49


Il mio blog: https://piero.dev
PM
Avatar
alpi39 (Normal User)
Pro


Messaggi: 63
Iscritto: 07/03/2008

Segnala al moderatore
Postato alle 22:25
Domenica, 24/08/2008
Grazie PieroTofy per la tempestività con la quale hai risposto alla mia richiesta di aiuto.
Pensavo, a causa della mia senilità, di aver dimenticato la chiocciola.
Sono tornato alla pag.30 della guida e ho notato che nel listato li riportato, non esiste nessuna chiocciola.
D'altra parte avendo io fatto il "copia e incolla" non potevo aver tralasciato un elemento così importante come tu lo definisci.
Ho comunque apportato la modifica al mio codice come tu mi dici di fare, ma il programma non parte perché mi segnala due errori:
Il primo, sottolineando la chiocciola mi avverte
"Prevista espressione"
Il secondo.sottolineandomi la "r" di

        While Not r.EndOfStream
            'Si aggiunge la nuova linea letta al testo di una textbox
            TextBox2.Text += r.ReadLine
        End While

mi dice: Errore    2    Nome 'r' non dichiarato

Io non capisco, visto che è dichiarato alla riga

Dim r As New IO.StreamReader(@"C:\Anno\Mese\Giorno\Giorno.txt")

Ti ringrazio nuovamente per il tuo messaggio di aiuto e spero ancora di leggerti;
alpi39 (Alberto)

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 12:08
Sabato, 30/08/2008
In vb.net non serve @.

Forse volevi scrivere:
Codice sorgente - presumibilmente C# / VB.NET

  1. 'Legge il file C:\Giorno.txt
  2. Dim r As New IO.StreamReader("C:\" & Anno & "\" & Mese & "\" & Giorno & "\" & Giorno & ".txt")


PM
Avatar
alpi39 (Normal User)
Pro


Messaggi: 63
Iscritto: 07/03/2008

Segnala al moderatore
Postato alle 3:03
Lunedì, 01/09/2008
Testo quotato

Postato originariamente da Il Totem:

In vb.net non serve @.

Forse volevi scrivere:
Codice sorgente - presumibilmente C# / VB.NET

  1. 'Legge il file C:\Giorno.txt
  2. Dim r As New IO.StreamReader("C:\" & Anno & "\" & Mese & "\" & Giorno & "\" & Giorno & ".txt")




Grazie, grazie infinite Totem. Oggi mi sono accorto ancora di più quanto grande sia la mia ignoranza in VB.NET.
E pensare che la stessa riga di codice l'ho usata per registrare i dati che ora desidero leggere ed inserire all'interno di una TextBox.
C'è solo un problema che ora ti espongo pregandoti di aiutarmi a risolvere:
Nel File .txt ci sono tre o più righe di testo ed ognuna ha, come carattere finale il chr(13) ovvero il ritorno a capo.
Ed in effetti, se apro il file con Word Pad, vedo le tre o quattro righe tutte che sono con il ritorno carrello e quindi tutte tornano a capo, mentre se le carico con il programma nel quale ho inserito la riga di codice che tu mi hai segnalato, queste righe mi appaiono collegate una dietro l'altra come se facessero parte di un'unica riga. E inoltre, se vado a leggere un altro file, questo si accoda a quello precedente, mentre io vorrei che il file precedente sparisse per poter visionare solo il secondo file.
Puoi, per favore, aiutarmi?
Grazie
alpi39 (Alberto)

Ultima modifica effettuata da alpi39 il 01/09/2008 alle 3:06
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:37
Lunedì, 01/09/2008
Il mio codice serve solo per l'apertura. Quello che ti serve modificare non è quello che ti ho suggerito, ma questo pezzo:
Codice sorgente - presumibilmente C# / VB.NET

  1. While Not r.EndOfStream
  2.   'Si aggiunge la nuova linea letta al testo di una textbox
  3.    TextBox2.Text += r.ReadLine
  4. End While


Infatti la funzione ReadLine legge una riga di testo, ma la restituisce senza il carattere a capo alla fine. Quindi devi aggiungerlo tu.
Inoltre, hai usato l'operatore +=, che ogni volta aggiunge il testo alla textbox, ma senza cancellare prima il contenuto.
Questo è il codice giusto:
Codice sorgente - presumibilmente C# / VB.NET

  1. TextBox2.Text = ""
  2. While Not r.EndOfStream
  3.   'Si aggiunge la nuova linea letta al testo di una textbox
  4.   TextBox2.Text += r.ReadLine + vbCrLf
  5. End While


PM
Avatar
alpi39 (Normal User)
Pro


Messaggi: 63
Iscritto: 07/03/2008

Segnala al moderatore
Postato alle 13:11
Lunedì, 01/09/2008
Testo quotato

Postato originariamente da Il Totem:

Il mio codice serve solo per l'apertura. Quello che ti serve modificare non è quello che ti ho suggerito, ma questo pezzo:
Codice sorgente - presumibilmente C# / VB.NET

  1. While Not r.EndOfStream
  2.   'Si aggiunge la nuova linea letta al testo di una textbox
  3.    TextBox2.Text += r.ReadLine
  4. End While


Infatti la funzione ReadLine legge una riga di testo, ma la restituisce senza il carattere a capo alla fine. Quindi devi aggiungerlo tu.
Inoltre, hai usato l'operatore +=, che ogni volta aggiunge il testo alla textbox, ma senza cancellare prima il contenuto.
Questo è il codice giusto:
Codice sorgente - presumibilmente C# / VB.NET

  1. TextBox2.Text = ""
  2. While Not r.EndOfStream
  3.   'Si aggiunge la nuova linea letta al testo di una textbox
  4.   TextBox2.Text += r.ReadLine + vbCrLf
  5. End While



Grazie Totem.
Grazie infinite.
Ieri sera ho inserito il messaggio (da me erano le 20 di domenica e in Italia era già l'una di lunedì) e questa mattina (da ma sono le otto e in Italia sono le 13) ho trovato il tuo messaggio con la soluzione ai due problemi che ti avevo esposto.
Grazie nuovamente.
alpi39(Alberto)

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:22
Martedì, 02/09/2008
Ok, allora chiudo.

PM