Oppure

Loading
27/05/10 21:23
Mr SaJaN
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:
    Private Sub btnModifica_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnModifica.Click
        Dim tempFileName As String = System.IO.Path.GetTempFileName()
        Dim NomeFile As String = "C:\file.txt"
        Using FileRead As New System.IO.StreamReader(NomeFile)

            Using FileWrite As New System.IO.StreamWriter(tempFileName, False)
                'stringa per identificare la riga
                Dim str2 As String = "<key>Library Persistent ID</key>"
                Dim STRINGALETTA As String
                Do
                    STRINGALETTA = FileRead.ReadLine()
                    'la riga letta è quella interessata?
                    If InStr(STRINGALETTA, str2) = 2 Then
                        'prendo il pezzo che mi serve
                        Dim StringaFinale As String = Mid$(STRINGALETTA, 42, 16)
                        'scrivo la nuova riga
                        FileWrite.WriteLine(STRINGALETTA.Replace(StringaFinale, "boh"))
                    Else
                        'altrimenti lascio così come è tuttora
                        FileWrite.WriteLine(FileRead.ReadLine())
                    End If
                Loop Until STRINGALETTA Is Nothing
            End Using
        End Using

        'creo una copia di backup che non si sa mai :D
        Dim nomeFileBackup As String = NomeFile
        Dim k As Integer = NomeFile.LastIndexOf(".")
        If k > 0 Then
            nomeFileBackup = NomeFile.Substring(0, k)
        End If
        nomeFileBackup += ".bak"
        If IO.File.Exists(nomeFileBackup) Then
            IO.File.Delete(nomeFileBackup)
        End If
        IO.File.Move(NomeFile, nomeFileBackup)
        IO.File.Delete(NomeFile)
        IO.File.Move(tempFileName, NomeFile)
    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:
<key>Application Name</key><string>Valore1</string>
	<key>Application Version</key><string>Valore2</string>
	<key>Library Persistent ID</key><string>13C4B189A8A62F67</string>
	<key>Traccia</key>
		<key>1248</key>


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

Grazie mille ;)
aaa
28/05/10 8:02
Alfonso
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 28/05/10 8:03
aaa
28/05/10 8:35
Mr SaJaN
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>
aaa
28/05/10 8:56
Alfonso
 Else
    'altrimenti lascio così come è tuttora
    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)
aaa
28/05/10 9:30
Mr SaJaN
si ma io dichiaro questo:
STRINGALETTA = FileRead.ReadLine()
quindi scrivere questo:
FileWrite.WriteLine(STRINGALETTA)
dovrebbe essere uguale a scrivere:
FileWrite.WriteLine(FileRead.ReadLine())
aaa
28/05/10 10:57
Alfonso
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.
aaa
28/05/10 15:51
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 ;)
aaa
29/05/10 8:39
Il Totem
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.
aaa