/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
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 :)



Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409074
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste