[ byTer @ 21.10.2004. 17:07 ] @
Koja je procedura da prebacim binarni fajl u string pošto do sada nisam uspeo ni na jedan način. Znači otvaram fajl ili sa AssignFile ili sa TFileStream.Create. NI na jedan način nisam došao do rešenja. Da li je ovo uopšte moguce i ako jeste kako?
[ bancika @ 21.10.2004. 19:54 ] @
cekaj, nisi bas jasan, pominjes stringove a pises TFileStream
da otvoris fajl (tekstualni) se koristi
Code:

var f: TextFile
...
AssignFile(F,'c:\autoexec.bat');
Reset(F); //ili Rewrite za upis ili Append za dodavanje na kraj
...
CloseFile(F);

a ako hoces da koristis TFileStream
Code:

var f: TFileStream; 
     s: string;
...
F := TFileStream.Create('C:\test.txt', fmOpenRead);
try
  //obrada
  //F.Seek za pozicioniranje u strimu
  //F.Read za citanje za pozicije
  //F.Write za upis, pogledaj help za sintaxu 
  //za upis u string ide:
  F.Read(s, F.Size);
finally
  F.Free;
end

mozda sam se negde zeznuo u kucanju, ali je princip bitan :)
[ Milos D @ 24.10.2004. 10:25 ] @
Probaj, ja ovo doduse koristim za tekst, a ne binarni sadrzaj.
Code:

function FileToStr (FileName : string): string;
var f : TFileStream;
begin
   result := '';
   if not FileExists(FileName) then exit;
   f := nil;
   try
     f := TFileStream.Create (FileName, fmOpenRead);
     SetLength (result, f.size);
     if f.size>0 then f.read (result[1], f.Size);
   except

   end;
   f.free;
end;
[ byTer @ 24.10.2004. 20:59 ] @
Dobro, ovo sam sam resio. E sad kako da uradim sledece.
String koji dobijem je razlicite velicine. Kako da definisem variant record (javlja mi gresku pri deklarisanju promenljive) da snimim taj string u fajl?
[ bancika @ 24.10.2004. 23:25 ] @
za snimanje u fajl bih ti preporucio da radis sa XML-om, nekako je mnogo elegantnije nego fajl slogova (uz to, string u slogu mora biti onaj "starovremski", ogranicen na 255 karaktera")
[ byTer @ 25.10.2004. 11:17 ] @
Ne. Potrebno mi je da taj fajl bude bas binaran, posto sadrzi i zip datoteku ukljucenu u sebe, ne bi islo sa xml-om. A sto se tice recorda mozes napraviti array of chars pa da to sve smestis u takav jedan niz slovo po slovo.

Fora kod mene je sto ne znam nikad kolike ce velicine da bude fajl pa tako ne znam kako da definisem record a da nema mnogo praznog prosora.

Jos jedan problem koji se namece je nemogucnost ucitavanja velikog binarnog fajla u ram. Mozda bi mogo preko pointera da se uradi da se cita sa diska, ali o tom cu razmisljati kasnije.
[ sasas @ 25.10.2004. 11:38 ] @
Citat:
byTer
napraviti array of chars pa da to sve smestis u takav jedan niz slovo po slovo.

Fora kod mene je sto ne znam nikad kolike ce velicine da bude fajl pa tako ne znam kako da definisem record a da nema mnogo praznog prosora.

Jos jedan problem koji se namece je nemogucnost ucitavanja velikog binarnog fajla u ram. Mozda bi mogo preko pointera da se uradi da se cita sa diska, ali o tom cu razmisljati kasnije.


Kako ucitavas fajl? Ako ga ucitavas u array, koristi VarArrays, nesto ovako:

var c: array of char;

SetLength(c, velicinafajlaubajtima);

ovakav array moze biti veeeeeliki (koliko god memorije imas, mislim).

ne znam koliko ti ovo pomaze...

ss.
[ byTer @ 25.10.2004. 13:04 ] @
Ocigledno nista. Treba mi to kod definisanja recorda... Kako li to rade mysql, kompajleri i ostali programi?!
[ sasas @ 25.10.2004. 13:19 ] @
Citat:
byTer: Ocigledno nista. Treba mi to kod definisanja recorda...


Sad mi tek nista nije jasno

A da li mozes da posaljes neki sample kood? Ili bar primer sta tacno zelis da uradis?
[ byTer @ 25.10.2004. 13:32 ] @
Code:

type TSize = 0..5;

type Tbackup = record
  source: String[255];
  destination: String [255];
  title: String[255];
  dateCreated: TDateTime;
  noOfObj: integer;
  lastUpdate: TDateTIme;
  noOfUpdates: integer;
  version1: string[2];
  version2: string[2];
  memo: String[255];
  //data: TFileStream;
  // data: array [1..400000] of AnsiChar;
  case size: TSize of
    0: (xsdata: array [0..16384] of AnsiChar); // 16K
    1: (sdata: array[0..163840] of AnsiChar); // 160K
    2: (mdata: array[0..1638400] of AnsiChar); // 1.6M
    3: (ldata: array[0..16384000] of AnsiChar); // 16M
    4: (xldata: array[0..163840000] of AnsiChar); // 160M
    5: (hdata: array[0..1638400000] of AnsiChar); // 1.6G
end;


O ovome se radi. Samo recimo ako imam fajl od 170 k glupo bi bilo da fajl bude 1.6 MB, vec da se to nekako resi. A i ovakav record kod deklarisanja daje 'stack overflow' gresku.
[ broker @ 25.10.2004. 14:26 ] @
Ako je datoteka binarna a ne tekstualna onda je tretiraj kao takvu a podatke ciitaj sa BlockRead i pisi sa BlockWrite. Tako nece imati nikakvih ogranicenja i moci ces da baratas sa podacima bilo kakve strukture ili duzine.
[ Rapaic Rajko @ 25.10.2004. 15:20 ] @
E...ovo je toliko nespretno, da nemam reci. Pa sta si ti mislio, da mozes da kazes samo
Code:

  write(anyFile, MyVarRecord);


i da ti on ispise u jednom potezu 1.6 GB u fajl? Kamo srece da je to moguce.
Umesto TBackup recorda napravi TBackup klasu, koja sadrzi sve sto si naveo, plus umesto buffer-a, neka sadrzi STRING (nema boljeg dinamickog buffer-a), plus metode za otvaranje fajla, ispis u njega i zatvaranje istog. Ispis string-buffer-a ces raditi sa BlockWrite (nego kako), koje je uzgred VEOMA brz ispis (nema nikakvih provera tipova ni velicine; takodje DIREKTAN pristup harddisku - ako se dobro secam help-a iz TurboPascal-a). E sad, ako zadas predefinisane velicine tvog stringa (prema onom case-u gore), moguce je pisanje i ucitavanje istog u JEDNOM prolazu (jedan poziv BlockWrite/BlockRead-a); sve sto ti treba je da pozicioniras file pointer na pravu poziciju (Seek). Ali, ako ucitavas/pises one sitne varijable sa BlockRead/BlockWrite, mozda ti i ne treba Seek, jer BlockXXX funkcije same pomeraju pointer po fajlu.
Uh...dosta od mene zasad.

Rajko
[ Rapaic Rajko @ 25.10.2004. 15:26 ] @
Ajd' jos malo, skoro sam siguran da se neces snaci sa stringom i BlockRead/BlockWrite.
Code:

  // ajmo prvo ucitavanje iz fajla
  SetLength(mystring, AnyBigSize);
  BlockRead(anyFile, mystring[1], AnyBigSize);
  ...
  // ispis u fajl
  BlockWrite(anyFile, mystring[1], length(mystring));


Istini za volju, ovakav ispis je vrlo nesiguran (jer za veliki string ima da TRAJE), tako da je bolje izvesti seriju poziva BlockRead/BlockWrite-a sa manjom kolicinom podataka po pozivu. Na taj nacin, mozes da izvedes da ti aplikacija 'dise', pa cak i da prekines ceo postupak.

Rajko
[ byTer @ 25.10.2004. 15:37 ] @
Pravljenje klase. Sta bih mogao time da postignem. I jel bih mogao objekat klase da smestim u fajla (ako da prenesem / implementiram svojstva save to file itd.)
[ morlic @ 25.10.2004. 16:02 ] @
Da su ovako radili u Borlandu, Delphi bi bio na trzistu pola sata, a onda bi uz veliki tresak propao za sva vremena...

U svakom slucaju Rajko je u pravu, koristi BlockWrite/BlockRead, a ja savetujem da radis sa dinamickim uzimanjem memorije (GetMem/FreeMem) sa blokovima podataka razumne velicine. Dobar program je onaj koji se dobro ponasa na razlicito skaliranim masinama, a ne onaj koji u startu trazi cesto nepotrebne kolicine RAM-a/CPU-a/Diska. Naravno, tu ne mislim na softver tipa SQL server, 3DMax i slicno, vec na obicne programe. Sta ako treba da upises 500MB podataka na masini koja ima 128MB ram-a? Dobices obilno koriscenje swap fajla i degradirati performanse do nepodnosljivog nivoa ako primenis svoje resenje. Znaci sve treba deliti u manje blokove koji nece dovesti do manjka slobodnog fizickog RAM-a. Memorija je mnogo brza od diska i to uvek treba imati na umu. Probaj da ucitas u Notepad fajl od 16MB i isti fajl u npr. WinHex editor. Razlika je velika - zasto? Zato sto je WinHex pravljen da izlazi na kraj i sa malim i sa velikim fajlovima citajuci manje blokove po potrebi, dok je Notepad pravljen za citanje malih txt fajlova koji obicno nisu teski vise megabajta, pa je odluceno da ceo sadrzaj ucitava odjednom.

Inace sav upis na disk MORA da ide preko samog windows-a , tu nema pomoci ali tu je vec napravljena toliko dobra optimizacija da ti samo mozes da usporis stvar svojim resenjima, a nikako da popravis vec popravljeno.
[ byTer @ 25.10.2004. 16:29 ] @
do sa block read, bock write mi se ;ini razumnim, ali necu li tao poremetiti strukturu fajla? Ili jedino da kolicina baffera bude tacno koliko i jedno polje iz one promenljive.
Moracu malo da istestiram da vidim kako radi, pa se čujemo opet.