Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB 2008] Problema scrittura file
Forum - C# / VB.NET - [VB 2008] Problema scrittura file

Avatar
Mr SaJaN (Normal User)
Rookie


Messaggi: 22
Iscritto: 23/07/2007

Segnala al moderatore
Postato alle 23:23
Giovedì, 27/05/2010
Salve a tutti, sto provando a fare un programma che sostituisca su un file di testo una serie di caratteri, ma quando vado a riscrivere il file mi viene scritta una riga si e una riga no.. apparentemente non trovo l'errore..

sono passato da poco a vb2008 (usavo vb6 ma mi ero un pò allontanato dalla programmazione) e ora per prendere dimestichezza con il vb volevo cominciare con cose semplici, ma qui di semplice mi sa che c'è ben poco :pat: :pat:

ecco il mio codice:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub btnModifica_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnModifica.Click
  2.         Dim tempFileName As String = System.IO.Path.GetTempFileName()
  3.         Dim NomeFile As String = "C:\file.txt"
  4.         Using FileRead As New System.IO.StreamReader(NomeFile)
  5.  
  6.             Using FileWrite As New System.IO.StreamWriter(tempFileName, False)
  7.                 'stringa per identificare la riga
  8.                 Dim str2 As String = "<key>Library Persistent ID</key>"
  9.                 Dim STRINGALETTA As String
  10.                 Do
  11.                     STRINGALETTA = FileRead.ReadLine()
  12.                     'la riga letta è quella interessata?
  13.                     If InStr(STRINGALETTA, str2) = 2 Then
  14.                         'prendo il pezzo che mi serve
  15.                         Dim StringaFinale As String = Mid$(STRINGALETTA, 42, 16)
  16.                         'scrivo la nuova riga
  17.                         FileWrite.WriteLine(STRINGALETTA.Replace(StringaFinale, "boh"))
  18.                     Else
  19.                         'altrimenti lascio così come è tuttora
  20.                         FileWrite.WriteLine(FileRead.ReadLine())
  21.                     End If
  22.                 Loop Until STRINGALETTA Is Nothing
  23.             End Using
  24.         End Using
  25.  
  26.         'creo una copia di backup che non si sa mai :D
  27.         Dim nomeFileBackup As String = NomeFile
  28.         Dim k As Integer = NomeFile.LastIndexOf(".")
  29.         If k > 0 Then
  30.             nomeFileBackup = NomeFile.Substring(0, k)
  31.         End If
  32.         nomeFileBackup += ".bak"
  33.         If IO.File.Exists(nomeFileBackup) Then
  34.             IO.File.Delete(nomeFileBackup)
  35.         End If
  36.         IO.File.Move(NomeFile, nomeFileBackup)
  37.         IO.File.Delete(NomeFile)
  38.         IO.File.Move(tempFileName, NomeFile)
  39.     End Sub


dato che il testo da sostituire può cambiare da pc a pc, io identifico la riga che mi interessa con "<key>Library Persistent ID</key>", identificata la riga, gli dico di partire da 42° carattere e contarne 16, in modo da restituirmi ciò che mi interessa.. poi questa stringa andrebbe rimpiazzata con un'altra, alla quale io ho momentaneamente dato il valore "boh", se la riga non è quella interessata, la legge e la riscrive senza apportare nessuna modifica.. io sto facendo le prove con questo file di testo:
Codice sorgente - presumibilmente Plain Text

  1. <key>Application Name</key><string>Valore1</string>
  2.         <key>Application Version</key><string>Valore2</string>
  3.         <key>Library Persistent ID</key><string>13C4B189A8A62F67</string>
  4.         <key>Traccia</key>
  5.                 <key>1248</key>



Qualcuno sa spiegarmi cosa c'è di sbagliato nel mio codice e perchè scrive una riga si e una no?? :-| :-|

Grazie mille ;)

PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 10:02
Venerdì, 28/05/2010
Con Readline recuperi la riga completa del carattere di ritorno a capo.
con Writeline aggiungi alla riga il carattere di ritorno a capo, pertanto te ne ritrovi due.

Ultima modifica effettuata da Alfonso il 28/05/2010 alle 10:03


che le risposte ti siano servite o meno un tuo riscontro è segno di cortesia.

http://www.alfonsonatale.altervista.org/
PM Quote
Avatar
Mr SaJaN (Normal User)
Rookie


Messaggi: 22
Iscritto: 23/07/2007

Segnala al moderatore
Postato alle 10:35
Venerdì, 28/05/2010
il problema non è che scrive 2 volte 'a capo', ma che quando scrive nel nuovo file scrive 1 riga si e una la salta..
viene fuori questo file:

<key>Application Name</key><string>Valore1</string>
    <key>Library Persistent ID</key><string>13C4B189A8A62F67</string>
        <key>1248</key>

PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 10:56
Venerdì, 28/05/2010
Codice sorgente - presumibilmente C# / VB.NET

  1. Else
  2.     'altrimenti lascio così come è tuttora
  3.     FileWrite.WriteLine(FileRead.ReadLine())



Mi sembra che quì tu legga un'altra riga del file invece di scrivere la riga appena letta e non modificata.
  
FileWrite.WriteLine(STRINGALETTA)


che le risposte ti siano servite o meno un tuo riscontro è segno di cortesia.

http://www.alfonsonatale.altervista.org/
PM Quote
Avatar
Mr SaJaN (Normal User)
Rookie


Messaggi: 22
Iscritto: 23/07/2007

Segnala al moderatore
Postato alle 11:30
Venerdì, 28/05/2010
si ma io dichiaro questo:
STRINGALETTA = FileRead.ReadLine()
quindi scrivere questo:
FileWrite.WriteLine(STRINGALETTA)
dovrebbe essere uguale a scrivere:
FileWrite.WriteLine(FileRead.ReadLine())

PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 12:57
Venerdì, 28/05/2010
Non capisco come tu possa scrivere una cosa del genere.

Ogni volta che richiami FileRead.ReadLine leggi una riga del file.
Infatti usi un ciclo Do..Loop proprio per questo ed ogni volta attribuisci a Stringaletta la stringa estratta dal file.

Se invece di
If InStr(STRINGALETTA, str2) = 2 Then
tu scrivessi
If InStr(FileRead.ReadLine(), str2) = 2 Then  
staresti facendo il confronto con una riga nuova del file.


che le risposte ti siano servite o meno un tuo riscontro è segno di cortesia.

http://www.alfonsonatale.altervista.org/
PM Quote
Avatar
Mr SaJaN (Normal User)
Rookie


Messaggi: 22
Iscritto: 23/07/2007

Segnala al moderatore
Postato alle 17:51
Venerdì, 28/05/2010
quindi se io nella funzione lo richiamo due volte, lui legge prima una riga e poi l'altra??

io credevo che finchè fossi stato dentro al do, FileRead.ReadLine() mi restituisse sempre lo stesso valore, visto che il ciclo non era ricominciato e quindi non era stata letta nessun'altra nuova riga ^^

forse ho capito il problema.. provo e ti faccio sapere, grazie mille intanto ;)

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:39
Sabato, 29/05/2010
Testo quotato

Postato originariamente da Mr SaJaN:

quindi se io nella funzione lo richiamo due volte, lui legge prima una riga e poi l'altra??

io credevo che finchè fossi stato dentro al do, FileRead.ReadLine() mi restituisse sempre lo stesso valore, visto che il ciclo non era ricominciato e quindi non era stata letta nessun'altra nuova riga ^^

forse ho capito il problema.. provo e ti faccio sapere, grazie mille intanto ;)



Come fa la funzione a sapere che è dentro a un Do? Se fosse come dici, allora ogni funzione si comporterebbe in modo diverso a seconda di dove è posta, e ne risulterebbe una confusione tremenda...
E' la prima volta che la sento questa, almeno sei un po' originale :rotfl:

P.S.: Mid$ e InStr non sono funzioni .NET; usa String.Substring e String.IndexOf invece.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote