[ dava @ 02.10.2007. 08:12 ] @
Kako bi se ovo moglo izvesti, znaci recimo txt fajl ima pet linija, a mi zelimo izmjeniti samo jednu od njih. Istina, postoji dosta primjera o radu sa fajlovima, ali ovo nisam uspio pronaci. |
[ dava @ 02.10.2007. 08:12 ] @
[ Marko_L @ 02.10.2007. 19:13 ] @
Dugo nisam radio sa text fajlovima tako da se ne sećam da li postoji neki direktan način. Možda preko FSO. No, imam jednu ideju kako bi to moglo da se izvede, pa ako ti odgovara. Elem, mogao bi da čitaš fajl liniju po liniju i prepisuješ ga u neki privremeni, s tim što ćeš kad dođeš do tražene linije da upišeš novu vrednost, a onda obrišeš stari fajl i replejsuješ ga novim. U praksi to bi izgledalo nekako ovako.
Code: Private Sub Command1_Click() Dim brojac As Long Dim prvi_fajl As Integer Dim drugi_fajl As Integer Dim sText As String prvi_fajl = FreeFile Open "C:\proba.txt" For Input As #prvi_fajl drugi_fajl = FreeFile Open "C:\privremeni.txt" For Output As #drugi_fajl Do Until EOF(prvi_fajl) brojac = brojac + 1 DoEvents Line Input #prvi_fajl, sText If brojac = 3 Then Print #drugi_fajl, sText + "XXX" Else Print #drugi_fajl, sText End If Loop Close #prvi_fajl Close #drugi_fajl Kill "C:\proba.txt" Name "C:\privremeni.txt" As "C:\proba.txt" End Sub što bi trebalo da radi, naravno pod uslovom da postoji tekstualni fajl koji se nalazi na C i zove se proba.txt :) E sad, ako ti često trebaju ovakve izmene, pogotovo ako se radi sa više fajlova, ovo bi valjalo smestiti u neku funkciju, i takođe, za svaki slučaj privremeni fajl smeštati na App.Path tako da ne moramo da mislimo da li postoji disk koji smo odredili za privremeni fajl, ili da li je isti dostupan i druge eventualnosti. Dakle, nešto ovako Code: Private Function IzmeniLiniju(fajl As String, linija As Long, vrednost As String) As Long On Error GoTo greska Dim brojac As Long Dim prvi_fajl As Integer Dim drugi_fajl As Integer Dim sText As String prvi_fajl = FreeFile Open fajl For Input As #prvi_fajl drugi_fajl = FreeFile Open App.Path & "\privremeni.txt" For Output As #drugi_fajl Do Until EOF(prvi_fajl) brojac = brojac + 1 DoEvents Line Input #prvi_fajl, sText If brojac = linija Then Print #drugi_fajl, vrednost Else Print #drugi_fajl, sText End If Loop Close #prvi_fajl Close #drugi_fajl Kill fajl Name App.Path & "\privremeni.txt" As fajl IzmeniLiniju = 0 Exit Function greska: IzmeniLiniju = Err.Number End Function A onda poyivamo funkciju na standardan način Code: Private Sub Command1_Click() Dim ret As Long ret = IzmeniLiniju("C:\proba.txt", 4, "neka vrednost") If ret = 0 Then MsgBox "Operacija je uspela" Else MsgBox "Operacija nije uspela. Greska broj : " & ret End If End Sub što će u fajlu proba.txt promeniti četvrtu liniju u "neka vrednost". Povratnu vrednost koristimo ako želimo da znamo da li je došlo do greške ili ne, i koji je broj greške. Može se naravno, iskombinovati i drugačije, ali to vidi sam :) [ rgdrajko @ 02.10.2007. 22:05 ] @
Mislim da je najlakse, bez neke muke i sa malo koda, to izvesti sa RichTextBox kontrolom koja vec radi kao kompletni editor. Dovoljno je samo dodati dugme snimi.
Code: Option Explicit Dim imefajla As String Private Sub Command1_Click() RichTextBox1.SaveFile imefajla End End Sub Private Sub Form_Load() imefajla = App.Path & "\proba.txt" RichTextBox1.FileName = imefajla End Sub [ Shadowed @ 02.10.2007. 22:28 ] @
I tako ce za tekst "test" dobiti fajl u kojem stoji:
{\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fnil\fcharset0 MS Sans Serif;}} \viewkind4\uc1\pard\lang1033\f0\fs17 test \par } [ Marko_L @ 02.10.2007. 22:30 ] @
@rgdrajko
Pa ako ćemo tako, onda mu je još lakše da otvori text fajl u Notepadu i izmeni šta mu treba bez da se bakće sa programiranjem uopšte. [ rgdrajko @ 02.10.2007. 23:35 ] @
re: Shadowed
Apsolutno si u pravu za fajl koji ne postoji, bice rtf fajl, medutim Dava je rekao da je u pitanju txt fajl koji postoji. Ako ucita txt fajl i snimice ga kao txt fajl. Provereno Citat: Marko_L: @rgdrajko Pa ako ćemo tako, onda mu je još lakše da otvori text fajl u Notepadu i izmeni šta mu treba bez da se bakće sa programiranjem uopšte. Apsolutno si u pravu. [ Shadowed @ 02.10.2007. 23:51 ] @
Jok. Evo, ja sad probao - u notepad-u napisao 123, sacuvao kao c:\test.txt u project ubacio jedan tichtextbox i jedan button i sledeci kod:
Code: Private Sub Command1_Click() RichTextBox1.SaveFile ("c:\test.txt") End Sub Private Sub Form_Load() RichTextBox1.FileName = "c:\test.txt" End Sub I kada pokrenem projekat, ucita se tekst, ja promenim u nesto drugo i kliknem na button i zatim pogledam u notepad-u fajl i dobijem TRF kod. [ dava @ 03.10.2007. 07:50 ] @
@Marko_L istu ideju sam i ja imao, ali je doslo do novih komplikacija. Znaci uzeo sam u varijablu ostatak sadrzaja txt fajla (dio koji se ne mijenja), a dio koji se mijenja sam stavio u txtBox. Nakon izmjene, ukombinujem jedan sa drugim i upisem u txt. Pri sledecem citanju, posto citam liniju po liniju, pukne na drugoj liniji sa porukom da je EndOfFile. Tj. nakon zadnjeg upisa, sve u fajlu vidi kao jednu liniju! Sumnjam da je problem do formata texta.
Upisivanje radim ovako: Code: Set FsoUpis = New FileSystemObject Set ts = FsoUpis.OpenTextFile(App.Path & "\init.txt", ForWriting, True, TristateFalse) ' ' U BakFile varijabli je i izmjenjeni i neizmjenjeni text. ' ts.Write(BakFile) [ Eurora3D Team @ 03.10.2007. 12:46 ] @
Kako ti izgleda ovaj BakFile string pre upisa ?
Stavi npr Debug.Print BakFile da vidis jel string uopste razdvojen na redove. Ako nije treba da dodajes znak za odvajanje redova vbCrLf npr strBuffer = strBuffer & strNewText & vbCrLf Mozes i da zakacis kod (ako nije problem) ili deo , jer vidim da imas ideju sta / kako da uradis ali si prevideo neku sitnicu. Inace File object ima metode za citanje celog , citanje linije , preckakanje linije, upis .... Mozes i da dodas na kraj ako ga otvoris sa ForAppending. Pozdrav [ dava @ 03.10.2007. 14:03 ] @
vbCrLf je rjesenje :)
Ovo mi je hvalilo iza & chr(13) & Hvala lepa [ rgdrajko @ 03.10.2007. 16:50 ] @
Citat: Shadowed: Jok. Evo, ja sad probao - u notepad-u napisao 123, sacuvao kao c:\test.txt u project ubacio jedan tichtextbox i jedan button i sledeci kod: Code: Private Sub Command1_Click() RichTextBox1.SaveFile ("c:\test.txt") End Sub Private Sub Form_Load() RichTextBox1.FileName = "c:\test.txt" End Sub I kada pokrenem projekat, ucita se tekst, ja promenim u nesto drugo i kliknem na button i zatim pogledam u notepad-u fajl i dobijem TRF kod. Ok, u pravu si, moja greska. Ja po navici iz Total Commandera pritisnem F3 View a ne F4 Edit. U command buton treba ispraviti RichTextBox1.SaveFile ("c:\test.txt") sa: Code: RichTextBox1.SaveFile ("c:\test.txt"), rtfText Po defaultu snima uvek kao rtf format. Ako bas zelimo da snimimo kao rtf pisemo: Code: RichTextBox1.SaveFile ("c:\test.txt"), rtfRTF Pozdrav, Rajko [ Marko_L @ 03.10.2007. 17:01 ] @
I na kraju dobijemo šta ? Kopiju Notepad-a koju je teže koristiti nego sam Notepad :)
[ dava @ 04.10.2007. 07:35 ] @
Na kraju dobijemo init fajl u kojem se nalaze podesavanja za program koji trenutno radim. Pri startanju prg. procita parametre iz fajla, a omogucio sam editovanje fajla iz programa sto je u stvari neophodno jer sam napravio da su neki parametri kriptovani, pa ih dekriptujem i prikazem/izmjenim.
[ Shadowed @ 04.10.2007. 09:03 ] @
U takvoj situacijji je najbolje da imas naprvljenu funkciju koja cuva podesavanja na disk i koja cita sa diska. Onda prilikom neke izmene pozoves funciiju za cuvanje i ona to uradi. Ne treba ti posebna za izmenu pojedinacnih linija, jer je ceo fajl relativno mali.
[ dava @ 04.10.2007. 12:44 ] @
Mislim da me nisi skont'o. Podesavanja se cuvaju u init.txt fajlu na disku.
Init.txt sadrzi 7 linija - 7 parametara. Prva tri su kriptovana (FTP server, username i password za konekciju) i ona se edituju iz aplikacije. Ostali se mogu editovati direktno u txt fajlu, a to su neke putanje. [ goranvuc @ 04.10.2007. 21:56 ] @
Mozda da razmislis da parametre drzis u nekom xml fajlu? Tako ne bi imao problem da izmenis vrednost npr. treceg parametra pod imenom "password" a da istovremeno omogucis i direktnu izmenu teksta iz notepad-a, jer je xml ipak samo text file.
Za takve stvari je mnogo zgodnija xml struktura, koju mozes slobodno da definises i prilagodis svojim potrebama. Naravno, sve odradjujes preko Microsoft XML biblioteke (MSXML) i DOM modela. [ Shadowed @ 04.10.2007. 23:46 ] @
Koja god da je struktura, meni izgleda najlogicnije da ima klasu Settings koja ima propertije koji odgovaraju podesavanjima i metode Load i Save. Load jednostavno izcita podatke iz fajla i popuni promenljive, a save sve promenljive sacuva u fajlu. U njima se nalazi i (de)sifrovanje. Kada hoces nesto da promenis setujes property i pozoves Settings.Save. Fajl je mali i svakako nece biti problem sto se ceo ponovo zapisuje. Jednostavnije nego da radis izmenu jednog reda.
[ dava @ 05.10.2007. 09:59 ] @
Evo napravih funkciju kojoj prosledis cetiri parametra: putanja do fajla, linija koja se edituje, karakter koji oznacava pocetak parametra i novi parametar.
Code: Public Sub Izmjeni(PutanjaIFjl As String, Linija As Integer, NakonCHR As String, Parametar As String) Jos jedna stvar mi je potrebna, a to je referenciranje u real-time-u. Jer kad uvucem modul u projekat potrebno je referencirati FSO. [ Shadowed @ 05.10.2007. 10:45 ] @
U real-time-u? Ako mislis u runtime-u, onda, koliko mi je poznato, to nije moguce. Umesto toga koristi late binding i funkciju CreateObject
[ dava @ 06.10.2007. 12:48 ] @
U real-time-u, run-time-u ili u letu sto bi rekao prost covjek. ;)
Evo nova verzija modula. Vise nije potrebno u projektu dodati referencu FSO. Koristio sam kasno vezivanje (sad ce opet biti da sam se pogresno izrazio) :) Hvala na pomoci. Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|