[ Mirjana B. @ 05.09.2007. 11:57 ] @

Radim na aplikaciji koja content fajlova (dat kao niz bajtova) smesta u jedan zajednicki .bin fajl, pri cemu se pamte podaci o lokacijama da bi isti ti fajlovi mogli da se exportuju iz .bin fajla.
Za upisivanje content-a u .bin koristila sam klasu IO.FileStream, metodu Write(), koja vrsi append postojeceg .bin fajla i upisuje prosledjeni content na lokaciju u fajlu gde se pozicioniramo.

Medjutim problem nastaje kada npr. upisem u .bin container pogresan fajl, u tom slucaju zelim da izvrsim rollback svega sto se desilo posle toga, tj. da bin fajl vratim na prvobitno stanje, pre upisa pogresnog fajla (pritom imam podatak o lokaciji na kojoj je pocelo pogresno upisivanje).
Da li postoji neka metoda koja bi brisala sadrzaj .bin fajla pocev od odredjene lokacije, kao sto npr. metoda write() vrsi upis u postojeci fajl pocev od lokacije gde smo se pozicionirali.
Vec sam resila ovaj problem tako sto snimam zeljeni content (od pocetka bin fajla do lokacije od koje je poceo pogresan upis) u memoriju, brisem prethodni fajl, pa opet snimam novi koji je ono sto mi treba, ali se operacija dugo izvrsava kada je .bin 700 MBy i vise. Mislim da bi mnogo brze islo kada bi neka metoda radila direktno sa fajlom.

Ako neko zna odgovor, zamolia bih da napise :)
Pozdrav i hvala!
[ bjevta @ 05.09.2007. 19:13 ] @
Da je reč o manjim fajlovima, moglo bi se nešto smisliti i to da radi u memoriji. Međutim, kad je reč o fajlovima neodređene veličine, tipa 700+ MB, mislim da nikakvo keširanje promena i rollback neće drastično ubrzati performanse.

Recimo da je datoteka duga 100 000 bajtova. Ako treba rollback-ovati izmene od 95 000 do 96 000 bajta, najlakše je pokupiti sadržaj od 96 001 bajta pa nadalje prepisati na mesta počev od 95 000-og bajta. Dakle, promena je na kraju fajla i količina prebačenih podataka je mala. Ali, šta ako je greška negde na početku? Treba "prebaciti" skoro ceo fajl. Na ovaj način se može dobiti na performansama ali, ne uvek.

Ako su izmene dovoljno male tako da se mogu čuvati u memoriji, onda se mogu čuvati u kolekciji i aplicirati na eksplicitan zahtev korisnikana, recimo, steku (vrsta kolekcije u .Net-u), pa kad zatreba, fajl, apliciraju se izmene po zahtevu korisnika.

Ili, ako je poznat hardver na kome će raditi ovakav softver, pre svega ako ima 1.5GB RAM-a ili više i max file je, recimo 800MB, onda se može sve čuvati u memoriji. To bi drastično ubrzalo manipulaciju fajlom, ostali bi samo inicijalno učitavanje i završno snimanje kao time consuming operacija.

[Ovu poruku je menjao bjevta dana 05.09.2007. u 21:26 GMT+1]