Fbuffer er en privat TStringList hvori du har in text procedure SaveToFile(const Filename : String); begin if FileExists(FileName) then Fbuffer.LoadFromFile(fileName) Fbuffer.Add(TextToAppend); FBuffer.SaveTofile(Filename)
Som jeg har læst lidt om her på siden, så indlæser man indholdet af filen for at tilføje noget... men når man som i mit tilfælde er ved at lave et program der genererer store filer (flere GB) så er det meget uhensigtmæssigt at indlæse det hele hver gang...
Men måske jeg også griber det forkert an. Programmet skal bare lave en textfil af en hvis størrelse med tilfældige (eller ens) tegn. Mit program skriver til en fil i en lykke. Den skriver i blokke af 1KB da jeg fandt ud af at det er hurtigst (i forhold til 1MB osv.).
var fs : TFileStream; ... fs := TFileStream.Create(FileName,fmOpenWrite); fs.Seek(0,soFromEnd); ... nu kan du tilføje til filen med fs.Write() .. FreeAndNil(fs);
Eller for at demonstrere den oprindelige pascal-version idet der vist ikke er noget lettere når det drejer sig om tekstfiler:
const FileName = 'GiganticLogFile.log'; var fp : Textfile; begin assignfile(fp,FileName); if FileExists(FileName) then append(fp) else rewrite(fp); try writeln(fp,'Yet another line added'); finally closefile(fp); end; end;
Og hvad er det lige for nogle ekstra tegn den sætter ind i starten af filen? Min kode er som følger:
procedure TForm1.Button1Click(Sender: TObject); var fs : TFileStream; Writer : TWriter; Thing: String; i: Integer; begin for i := 1 to 1000000 do Thing := Thing + '1'; //Fyld variablen med 1 mio. 1-taller
if FileExists('d:\test.tst') then DeleteFile('d:\test.tst'); //Hvis filen eksisterer så slet den
fs := TFileStream.Create('d:\test.tst', fmCreate); //Opret filen fs.Seek(0, soFromEnd); //Er vel ikke nødvendigt når jeg kun skal oprette nye filer
Writer := TWriter.Create(fs, 1000000); try for i := 1 to 10 do Writer.WriteString(Thing); //Skriv 1 mio. 1-taller til filen 10 gange Label1.Caption := 'Done!'; //Giv besked om at filen er færdig finally Writer.Free; fs.Free; end; end;
I forhold til min "gamle" måde at skrive en stor fil, så er streams meget hurtigere. For at skrive en 10MB fil, tog det med den gamle metode 1,5sek med streams tager det kun 0,5sek så det er jo gode nyheder :-)
Damn! Den overså jeg, men godt at du har fået det til at virke. Har selv leget noget med TWriter og TReader og endte, pga. problemer med at indlæse strenge (aner stadig ikke hvor det går galt), med at bruge goe' gamle textfile.
Jeps, det virker, og kan da lige smide koden herind for god ordens skyld:
FileStream := TFileStream.Create(SaveDialog.Filename, fmCreate); //Create the file try for i := 1 to StrToInt(EdFileSize.Text) * Count do begin if Cancel then Break; ProgressBar.Position := Round(i); Application.ProcessMessages; FileStream.Write(WriteThing[1], LENGTH(WriteThing)); //Write the string to the file end; finally FileStream.Free end;
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.