Toon posts:

[Delphi] Groot 'blok' in één keer schrijven met filestream

Pagina: 1
Acties:

Verwijderd

Topicstarter
Euj iedereen...

Misschien weten jullie nog dat ik gister aan de gang ben geweest met het omdraaien van een jpg-file. Dat is toen gelukt dmv een filestream, alleen nu is er een probleem ontstaan.

Als ik een grote jpeg heb (zeg 1 mb) dan duurt het al gauw 10 tot 20 seconden voordat die hele file omgedraaid is. Dus nu heb ik er voor gekozen om alleen de eerste 200 tekens om te draaien. Ik heb wat gespeeld, en het volgende rolde eruit (het werkt dus niet...):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for charCount := 200 downto 0 do begin
 bufferData := ' ';
 instream.Seek(charCount,soFromBeginning);
 instream.Read(bufferData[1],1);
 outstream.Write(bufferdata[1],1);
end;

bufferData := '     ';
instream.seek(201, sofrombeginning);
buffersize := instream.size - 1 - 201;
instream.read(bufferdata,buffersize);
instream.write(bufferdata,buffersize);

instream.Free;
outstream.Free;


Dit geheel resulteert in een file van 201 bytes (de eerste for-lus dus). Wat doe ik fout? Hij wil gewoon niet dat blok writen!

[ Voor 4% gewijzigd door Verwijderd op 29-01-2003 18:51 ]


  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 08:36

Rannasha

Does not compute.

Delphi:
1
2
instream.read(bufferdata,buffersize);
instream.write(bufferdata,buffersize);


Kun je niet beter naar de outstream schrijven ? B)

|| Vierkant voor Wiskunde ||


Verwijderd

Topicstarter
Je hebt helemaal gelijk! Ik heb het veranderd, maar het werkt nog niet... Nu krijg ik een access violation op outstream.write(bufferdata,buffersize). Ik heb al geprobeerd om er
code:
1
2
instream.read(bufferdata, 20);
outstream.write(bufferdata,20);

van te maken, als test, maar dat verandert niets. Is er soms een andere (betere/simpelere) manier om een groot blok in één keer te lezen en weg te schrijven?

Verwijderd

hoe heb je Bufferdata gedeclareerd ???

Verwijderd

Topicstarter
hoe bedoel je? Ik heb gewoon
functie blaat
var
bufferdata:string;
begin
...
end;

Verwijderd

waarom gebruik niet een non-standaard comprimeer routine.

onleesbaar voor alle programma's , bestanden worden kleiner. niet backwaards te engineren tenzij ze de juiste routine weet.

op deze site staat er 1 sfpack http://www.utilmind.com errug simpel in gebruik.
foolproof en moelijk te cracken.

Verwijderd

Verwijderd schreef op 29 januari 2003 @ 19:53:
hoe bedoel je? Ik heb gewoon
functie blaat
var
bufferdata:string;
begin
...
end;
Gaat dat wel goed? string is toch gewoon een pointer?
Ik heb deze gister (got lag er ineens uit gisteravond, vandaar nu) ff geprobeerd en dit werkt goed naar mijn weten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure InvertFile(FileFrom, FileTo : string);
var
 Buf,Buf2 : PByteArray;
 Myfile : TFileStream;
 i,s : longint;
begin
 MyFile := TFileStream.Create(FileFrom, fmOpenRead);
 s := Myfile.Size;
 GetMem(Buf, s);
 GetMem(Buf2, s);
 MyFile.ReadBuffer(Buf^, s);
 MyFile.Free;
 for i := 0 to s - 1 do
    Buf2[i] := Buf[s - i - 1];
 MyFile := TFileStream.Create(FileTo, fmCreate);
 MyFile.Write(Buf2^, s);
 MyFile.Free;
 fREEMEM(BUF);
 FREEMEM(BUF2);
end; { InvertFile }

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Debug gewoon eens wat. Zet een breakpoint en kijk wat de variablen voor waarde hebben.

Delphi:
1
2
 instream.Read(bufferData[1],1);
 outstream.Write(bufferdata[1],1);

bufferdata[1]?! Dan overschrijf je dus altijd het eerste teken en kom je nooit verder.
Zelfs als je daar bufferData[charCount] van zou maken krijg je nog excepties. Dit omdat je AnsiString niet zomaar in lengte groeit. Je zal SetLength(bufferdata, 200) moeten gebruiken. bufferData[charCount] zal ook niet werken, want op deze manier draai je m niet om. Je zal daarvoor een aparte teller moeten gebruiken.

De exceptie komt omdat je string is geen 201 tekens is, maar 1. Waarom gebruik je niet Length(bufferdata) en zet je elke keer hard die getallen erin? Beetje slecht programmeren zo.

Aangezien je string toch precies 200 tekens wordt is het misschien gewoon veel handiger een ShortString te gebruiken van precies 200 tekens.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Wouw! Het werkt, en het is echt supersnel! Tnx Maui74!
Pagina: 1