|
| Læse og skrive filer større end 4gb (Delph~ Fra : Ingolf |
Dato : 14-04-05 20:03 |
|
Hej
Hvordan kan jeg 'seek' i en fil større en 4gb? Hvilken variable type
benyttes, og hvordan kan jeg aflæse filens størrelse?
Nogle andre hensyn til at læse og/eller skrive filer større end 4gb?
Bruger naturligvis NTFS.
| |
Uffe Kousgaard (14-04-2005)
| Kommentar Fra : Uffe Kousgaard |
Dato : 14-04-05 21:44 |
|
"Ingolf" <Dont_Spam_ingolf@excite.com> wrote in message
news:425ebdd2$0$22996$edfadb0f@dread15.news.tele.dk...
> Hej
>
> Hvordan kan jeg 'seek' i en fil større en 4gb? Hvilken variable type
> benyttes, og hvordan kan jeg aflæse filens størrelse?
Du skal bruge TFileStream, som kan tage int64 som argument. Alm. pascal
"file" du´r ikke.
hilsen
Uffe
| |
Ingolf (15-04-2005)
| Kommentar Fra : Ingolf |
Dato : 15-04-05 02:55 |
|
"Uffe Kousgaard" <oh@no.no> wrote in message
news:425ed612$0$178$edfadb0f@dtext01.news.tele.dk...
>
> Du skal bruge TFileStream, som kan tage int64 som argument. Alm. pascal
> "file" du´r ikke.
>
Takker for det, det ser ud til at funke.
Kan bare ikke få SEEK til at acceptere int64. Ved runtime får jeg fejl så
snart jeg SEEK'er >2gb :(
Problemet er at SEEK er implementeret 2 gange (?),se SysUtil.pas, og det ser
ud til at min stream kalder den første, som kun modtager LONGINT som input.
Kalder SEEK sådan:
var
togo : int64;
minfil : TFileStream;
begin
minfil:=TFileStream.Create('c:\enkæmpestor.fil',fmOpenRead);
togo:=3000000000; // position = 3gb. ca.
minfil.Seek(togo,soFromBeginning); // <-- FEJL her når togo>2gb
minfil.free;
end;
| |
Uffe Kousgaard (15-04-2005)
| Kommentar Fra : Uffe Kousgaard |
Dato : 15-04-05 09:33 |
|
"Ingolf" <Dont_Spam_ingolf@excite.com> wrote in message
news:425f1e79$0$22989$edfadb0f@dread15.news.tele.dk...
>
> Kan bare ikke få SEEK til at acceptere int64. Ved runtime får jeg fejl så
> snart jeg SEEK'er >2gb :(
Jeg har afprøvet din kode med en 5 gb fil og det virker fint. Måske det
kræver NTFS ?
hilsen
Uffe
| |
Ingolf (15-04-2005)
| Kommentar Fra : Ingolf |
Dato : 15-04-05 14:10 |
|
"Uffe Kousgaard" <oh@no.no> wrote in message
news:425f7c3f$0$176$edfadb0f@dtext01.news.tele.dk...
> "Ingolf" <Dont_Spam_ingolf@excite.com> wrote in message
> news:425f1e79$0$22989$edfadb0f@dread15.news.tele.dk...
>>
>> Kan bare ikke få SEEK til at acceptere int64. Ved runtime får jeg fejl så
>> snart jeg SEEK'er >2gb :(
>
> Jeg har afprøvet din kode med en 5 gb fil og det virker fint. Måske det
> kræver NTFS ?
>
> hilsen
> Uffe
>
>
Selfølgelig benytter jeg NTFS, så snart >2gb.. runtime error (range check
error, pga overflow)
Er det måske fordi jeg ikke har 'resettet' filen til at læse 1 byte af
gangen?.. ligesom
asssignfile(minfil,'c:\enfil.dat');
reset(minfil,1);
Ved bare ikke hvordan det gøres med en stream...
_
WinXpSp2
| |
Ingolf (15-04-2005)
| Kommentar Fra : Ingolf |
Dato : 15-04-05 14:54 |
|
Jeg har 'Range Checking', 'Overflow Checking' og 'IO-Checking' sat til.
Får hele tiden 'range check error' på SEEK funktionen.
Slår jeg 'range check' fra, og aflæser returværdien fra SEEK, så er den 0,
hvor den burde være 3000000000.
--
var
ret : int64
togo : int64;
....
togo:=3000000000
ret:=minfil.Seek(togo,soFromBeginning); // <-- ret=0.... ?
--
Kan du få det til at virke med 'range check'?
| |
Ingolf (15-04-2005)
| Kommentar Fra : Ingolf |
Dato : 15-04-05 15:44 |
|
Ahh endelig... hele moletjavsen skal typecastes 100% hvor der bruges
int64... :/
var
fil : TFileSTream;
togo : int64;
siz : int64;
ret : int64;
begin
fil:=TFileStream.Create( 'c:\enkæmpestor.fil',fmOpenRead);
int64(siz):=int64(fil.Size);
int64(togo):=3000000000;
int64(ret):=fil.Seek( int64(togo),Tseekorigin(sofrombeginning));
fil.Free;
end;
jaaa :)
| |
|
|