|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2003
Messaggi: 70
|
caricare/modificare una riga precisa di un file in VB6
Ciao, volevo chiedervi una mano per un probema col vb(6) che non ho saputo risolvere, premetto che di vb so molto poco, anche se qualche programmino sono riuscito a metterlo su, quindi per favore non siate tecnici perché credo che non capirei niente: gli esempi sono la cosa che mi spiega di più!
Comunque il problema è questo: in pratica voglio "aprire" un semplice file .ini col vb e caricare, controllare ed eventualmente modificare una sua riga precisa. In particolare non sono riuscito a selezionare proprio una specifica riga, il resto credo di saperlo fare da solo. Non ho idea di come fare, nonostante abbia provato vari modi seguendo la guida del vb o informazioni su internet. . . Vi ringrazio in anticipo, spero che qualcuno sappia come fare dai ci conto tnx ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
L'esempio che segue può darti un'idea...il problema è che con il metodo descritto, un file di testo lo puoi o aprire in lettura o in scrittura ma non assieme quindi dovresti fare diverse modifiche.
Potresti perciò fare una cosa del tipo: -rinomini il file che stai analizzando aggiungendo una estensione. es: da prova.ini -> prova.ini.bak -crei un nuovo prova.ini nel quale vai a scrivere le righe non modificate dell'originale e quelle modificate in base ai tuoi criteri -una volta salvato il nuovo file puoi cancellare quello di precendete Esempio di lettura da file di testo e ricerca stringa... Codice:
Dim fs, a, retstring Set fs = CreateObject("Scripting.FileSystemObject") Set a = fs.OpenTextFile("c:\test.ini", ForReading, False) Do While a.AtEndOfStream <> True retstring = a.ReadLine if instr(retstring,"quello che cerchi",vbTextCompare)<>0 then ' fai quello che devi end if Loop a.Close
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Aug 2001
Città: Gerenzano
Messaggi: 129
|
Oppure puoi fare una cosa di questo tipo senza creare l'oggetto Scripting..
Codice:
' *** sFile = Nome del file (Completo di percorso) ' lRowNumber = Riga da leggere ' Private Function f_GetFilesRowText(ByVal sFile As String, ByVal lRowNumber As Long) As String Dim iFile As Integer Dim bRowFound As Boolean Dim lRowCounter As Long Dim sRowText As String Dim sRet As String iFile = FreeFile() Open sFile For Input As #iFile Do While Not EOF(iFile) ' *** Scorro sequenzialmente il file. Input #iFile, sRowText lRowCounter = lRowCounter + 1 ' *** Incremento la posizione della riga corrente bRowFound = (lRowCounter = lRowNumber) ' *** Se sono sulla riga desiderata If bRowFound Then sRet = sRowText Exit Do End If Loop Close #iFile f_GetFilesRowText = sRet End Function
__________________
E' quasi tutto relativo! |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Oct 2003
Messaggi: 70
|
Grande cisky, funziona alla grande
![]() E se adesso volessi scriverla invece una determinata riga? Grazie mille x ora ![]() |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Aug 2001
Città: Gerenzano
Messaggi: 129
|
Devi utilizzare una funzione simile a quella che ho scritto ma devi aprire il file in scrittura
(es: Open sFile For Output As #iFile ) e devi utilizzare il metodo Write (es: Write #iFile, "prova"). NOTA: Se hai a che fare con dei file strutturati sempre in uno specifico modo puoi utilizzare le funzioni GET, PUT, SEEK per leggere.scrivere,posizionarsi su un file. ...Prova a dargli un'occhiata. Se non riesci a creare la funzione x scrivere la singola riga chiedi pure. ciao!
__________________
E' quasi tutto relativo! |
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Oct 2003
Messaggi: 70
|
Mmh... forse non mi sono spiegato su cosa voglio fare:
Sapevo come scrivere un valore in un file (ho fatto un programmino che legge un valore su una smart card attraverso il programmatore, salva il valore su un file, blocca completamente il pc e lo sblocca solo all'inserimento della stessa smart card). Io volevo in particolare prendere sto file, fai conto un file con scritto Codice:
Ciao sono ErMeglio Allora ho studiato a fondo la cosa e avevo fatto così (lasciando la tua funzione nel progetto): Codice:
Private Sub f_PutFilesRowText(sFile1 As String, lRowToChange As Long) Dim iFile1 As Integer Dim lRowNumber1 As Long Dim CompleteToWrite As String Dim a As String Dim c As String Dim d As String Dim wait As Long iFile1 = FreeFile() lRowNumber1 = 0 c = "+ Chr(13) +" Do While Not lRowNumber1 = lRowToChange - 1 a = f_GetFilesRowText("C:\prova.txt", lRowNumber1 + 1) + c Loop lRowNumber1 = lRowToChange Do While Not lRowNumber1 = 7 d = f_GetFilesRowText("C:\prova.txt", lRowNumber1 + 1) + c Loop CompleteToWrite = a + RowToBeStored + d Label2.Caption = CompleteToWrite Open sFile1 For Output Access Write As #iFile1 Write #iFile1, CompleteToWrite Close #iFile1 End Sub Codice:
Private Sub Timer1_Timer() If StoredAtStart <> f_GetFilesRowText("C:\prova.txt", 3) Then GoTo 1 Else GoTo 2 2: If StoredAtStart <> RowToBeStored Then GoTo 1 Else GoTo 3 1: f_PutFilesRowText "C:\prova1.txt", 3 3: End Sub Codice:
StoredAtStart = f_GetFilesRowText("C:\prova.txt", 3) Tutto ciò sembra aver senso e il vb nn corregge nulla, ma quando apro il programma si blocca sembra quando esegue la scrittura ![]() Hai qualche idea? (scusate il post lungo ma almeno mi sono spiegato x bene ![]() Tnx |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Oct 2003
Messaggi: 70
|
Ah Do While Not lRowNumber1 = 7, è 7 facendo conto che le righe del file siano 7.
|
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Aug 2001
Città: Gerenzano
Messaggi: 129
|
Uhm, non ho capito bene come deve funzionare il programma che aggiunge la riga di "blocco" al file.
Deve controllare la presenza della riga di blocco all'avvio della form e se non c'è deve aggiungerla? o deve eseguire questo controllo sempre ogni N secondi obbligatoriamente? All'uscita della form il blocco andrà rimosso? ... ??? ... In ogni caso ho dato un'occhiata al tuo codice ed ho notato alcune cose che secondo mè si possono ottimizzare. Oltre ai consigli ti invio anche il codice "rivisitato".La logica non l'ho capita bene, ma penso che ti potrò servire come spunto. Se hai qualsiasi dubbio chiedi pure! P.S: Ti scrivo questi consigli non per fare il "Guru" ma solo per darti delle "dritte". 1) sub f_PutFilesRowText In questa sub ho visto che effettui dei cicli per recuperare le righe precedenti e successive alla riga da scrivere (Utilizzando la funzione f_GetFilesRowText).In questo modo il file viene aperto e chiuso moltissime volte, e se il file è di grosse dimensioni si può impiegare molto tempo.Inoltre se si scatena l'evento del timer, la routine verrà rieseguita ma siccome il file è già aperto darà un errore! 2) La Sub Timer1_Timer() non è molto chiara perchè utilizzi dei goto.Ti converrebbe scriverla per passaggi Cioè: passo1: Codice:
Private Sub Timer1_Timer() If StoredAtStart <> f_GetFilesRowText("C:\prova.txt", 3) Then f_PutFilesRowText "C:\prova1.txt", 3 Else If StoredAtStart <> RowToBeStored Then f_PutFilesRowText "C:\prova1.txt", 3 Else ' *** End If End If End Sub Codice:
Private Sub Timer1_Timer() Dim bPutFile As Boolean Dim sRowFile As String sRowFile = f_GetFilesRowText("C:\prova.txt", 3) bPutFile = (StoredAtStart <> sRowFile) Or (StoredAtStart <> RowToBeStored) If bPutFile Then f_PutFilesRowText "C:\prova1.txt", 3 End Sub Questo che segue è l'esempio di codice che ho riscritto. Ricordati che io non ho capito bene la logica che vuoi utilizzare e non prende per "oro colato" quello che ho scritto (Anche perchè non l'ho provato!) Codice:
Option Explicit Private Const FILE_NAME As String = "W:\Documenti\xxx.txt" ' *** x Prova Private m_sRowToBeStored As String Private m_sStoredAtStart As String Private m_bWriteInProgress As Boolean Private Sub Form_Load() m_sStoredAtStart = f_GetFilesRowText(FILE_NAME, 3) ' *** Memorizzo il valore iniziale m_sRowToBeStored = "ROW KEY CODE" ' *** x Prova End Sub Private Sub Timer1_Timer() Dim bPutFile As Boolean Dim sRowText As String ' *** (X SICUREZZA) Se questo evento viene scatenato quando sto già eseguendo il codice di scrittura non devo ' fare nulla perchè altrimenti si potrebbero verificare degli errori, in quanto il file risulterebbe già aperto. ' If m_bWriteInProgress Then Exit Sub sRowText = f_GetFilesRowText(FILE_NAME, 3) ' *** Leggo la riga del file ' *** Controllo se la riga è diversa dalla riga di "blocco" da aggiungere ' bPutFile = (sRowText <> m_sRowToBeStored) If bPutFile Then ' *** Aggiungo la riga di blocco ' s_PutFilesRowText FILE_NAME, 3, m_sRowToBeStored End If Timer1.Enabled = Not bPutFile ' *** Se ho scritto la chiave diabilito il Timer End Sub Private Function f_GetFilesRowText(ByVal sFile As String, ByVal lRowNumber As Long) As String Dim iFile As Integer Dim bRowFound As Boolean Dim lRowCounter As Long Dim sRowText As String Dim sRet As String iFile = FreeFile() Open sFile For Input As #iFile Do While Not EOF(iFile) ' *** Scorro sequenzialmente il file. Input #iFile, sRowText lRowCounter = lRowCounter + 1 ' *** Incremento la posizione della riga corrente bRowFound = (lRowCounter = lRowNumber) ' *** Se sono sulla riga desiderata If bRowFound Then sRet = sRowText Exit Do End If Loop Close #iFile f_GetFilesRowText = sRet End Function Private Sub s_PutFilesRowText(ByVal sFile As String, ByVal lRowToChange As Long, ByVal sRowToWrite As String) Dim iFile As Integer Dim sRowText As String Dim lRowCounter As Long Dim sCompleteToWrite As String Dim bVaiACapo As Boolean On Error GoTo lError ' *** Gestione di eventuali errori m_bWriteInProgress = True ' *** Imposto il flag che indica che stò scrivendo sul file iFile = FreeFile() Open sFile For Input As #iFile Do While Not EOF(iFile) ' *** Scorro sequenzialmente il file. Input #iFile, sRowText ' *** Memorizzo nella variabile sRowText la riga del File bVaiACapo = (lRowCounter > 0) ' *** Flag che indica se andare a capo lRowCounter = lRowCounter + 1 ' *** Incremento la posizione della riga corrente ' *** A questo punto devo comporre il testo da scrivere nel file (sCompleteToWrite). ' Per fare ciò, controllo se devo inserire la riga da scrivere, altrimenti compongo il testo ' aggiungendo la riga letta di volta in volta. (se non è laprima riga, devo andare a capo.) ' If lRowCounter = lRowToChange Then ' *** Aggiungo riga da scrivere ' sCompleteToWrite = f_AppendTextToString(sCompleteToWrite, sRowToWrite, bVaiACapo) Else ' *** Aggiungo la riga letta dal file (Input #iFile,sRowText) ' sCompleteToWrite = f_AppendTextToString(sCompleteToWrite, sRowText, bVaiACapo) End If Loop ' *** Ciclo tutto il File Close #iFile 'Label2.Caption = CompleteToWrite iFile = FreeFile() Open sFile For Output Access Write As #iFile ' *** Non uso il comando WRITE perchè aggiunge le " all'inizo e alla fine del testo da scrivare!!!! ' Print #iFile, sCompleteToWrite 'Write #iFile, sCompleteToWrite Close #iFile lExit: m_bWriteInProgress = False Exit Sub lError: ' *** Devo intercettare l'errore per deimpostare il flag di scrittura in corso! Resume lExit End Sub ' *** Aggiunge del testo ad una stringa (Se specificato bACapo, aggiunge anche un ritorno a capo) ' Private Function f_AppendTextToString(ByVal sInitString As String, ByVal sTextToAdd As String, ByVal bACapo As Boolean) As String If bACapo Then sInitString = sInitString & vbCrLf sInitString = sInitString & sTextToAdd f_AppendTextToString = sInitString End Function ![]()
__________________
E' quasi tutto relativo! |
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Jan 2001
Messaggi: 1976
|
mah ....
![]() |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Feb 2008
Messaggi: 224
|
E' + o - lo stesso problema che ho io ma visto che non ci ho capito molto, vorrei gentilmente che mi fosse spiegato nel mio caso come fare sapendo che:
C'e' un determinato file chiamato per esempio database.db dove al suo interno ci sono dei dati. Ciascun dato è formato da 5 righe. Ora il problema è che vorrei sovrascrivere questo file ma andando a sostituire solo la quinta riga e lasciando invariate le altre 4 righe precedenti. Usando la funzione replace al 5° rigo riesco a sovrascrivere l'ultimo record come voglio pero' vorrei sapere appunto come sovrascrivere lo stesso file ma lasciando invariate le altre 4 righe. Questa operazione verrà fatta ogni 10 righe in pratica fino alla fine del file. Grazie mille anticipate a chi mi sapra' aiutare!
__________________
CPU: INTEL Core i7 3770 Scheda Madre: Asus P8Z77-M Pro Ram: DIMM DDR3 Corsair 16GB/1600Mhz Vengeance [2x8GB] Scheda Video: nVidia Zotac GTX1060 6GB GDDR5 Scheda Audio: Integrata Realtek 5.1 Hard Disk: 1TB Western Digital [WD1002FAEX] Case: Enermax Midi OSTROG Alimentatore: Seasonic Focus PX-850W Masterizzatori: Asus DRW-24B5ST 24X |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:36.