Autor Beitrag
TheUnknown
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 334



BeitragVerfasst: Di 28.08.07 09:20 
Hi Leute,

ich habe ein Problem mit TFileStream. Bei Dateien größer 2GB (bzw. größer als High(Integer)), übergibt TFileStream an "Empfänger" falsche Werte, weil z.B. TFileStream.Size nicht mehr stimmt.

Gibt's eine Alternative zu TFileStream (oder einen Workaround) der mit Files >2 GB!

PS: Ich brauche das NICHT, um die Dateigröße zu ermitteln, sondern um bestimmte Merkmale diverser Dateien (z.B. Header einer WAV) auszuwerten...

Hier mal ein stark vereinfachter Codeschnippsel.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function BLABLA : ResultWertIstEgal;
var FS: TFileStream;
    EMPFÄNGER: TEMPFÄNGER;
begin
  FS := TFileStream.Create(sFileName, fmOpenRead);
  try
    // Übergebe FS jetzt an den Empfänger,
    // sodass er (wie auch immer) damit arbeiten kann
    EMPFÄNGER := TEMPFÄNGER.Create(FS);
    Result := EMPFÄNGER.IrgendeineEigenschaft;
  finally
    FreeAndNil(FS);
    FreeAndNil(EMPFÄNGER);
  end;


Wichtig ist, dass EMPFÄNGER, den nicht ICH, sondern eine Fremd-Unit defniert, für sein Create() ein TStream-Objekt erwartet... Soweit klappt auch alles. Es sei denn, die Datei ist größer als 2 GB.
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Di 28.08.07 09:55 
Ich glaube das liegt nicht am TFileStream, sondern daran, dass du irgendwo im Empfänger aus einem Int64 einen Integer machst. TFileStream.Size ist nämlich vom Typ Int64 so weit ich weiß.
TheUnknown Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 334



BeitragVerfasst: Di 28.08.07 11:20 
Nein, ich mache da mit gar nichts.

Ich erstelle den Stream, übergebe ihn am EMPFÄNGER und lese dann eine Eigenschaft im Empfänger aus mit Result := Blabla;. Das ist alles.

Danach geb ich den Stream und EMPFÄNGER wieder frei.

Zur Gegenprobe habe ich mal was getestet: Ich habe eine Datei in einen FileStream geladen und mir dann mit FileStream.Size dessen Größe anzeigen lassen...

Das klappte immer perfekt - aber NUR, solange eine Datei nicht größer als 2 GB ist. Dann kommen oft Minuswerte heraus.

Liegt es daran, dass ich Delphi 5 habe? Gibt's da keinen Workaround?

// EDIT: Habe gerade geguckt. Bei mir (Delphi 5) ist TStream.Size als Longint definiert. Was bei Delphi 5 wiederum dem hier entspricht: (aus der Onlinehilfe).

Longint |-2147483648..2147483647 |32 Bit, mit Vorzeichen
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 30.08.07 12:01 
Der Result-Typ wäre in diesem Fall einmal interessant und deine Delphi-Version.

Generell ist aber die Nutzung von TFileStream für solch große Dateien nicht empfehlenswert.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
TheUnknown Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 334



BeitragVerfasst: Do 30.08.07 13:29 
Nein, das Result ist egal, weil, in dem Moment, wo ich die Datei in den Stream schiebe und dann den Stream übergebe, kommt der Fehler - ich komme erst gar nicht dazu, das Result festzulegen... Zumindest, wenn die Datei größer 2GB ist. Ist sie auch nur minimal kleiner, passiert gar nichts und das Result ist so, wie ich's will!

Und wie ich schrieb, hab ich Delphi 5 - steht auch links in meinen Profilangaben.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 30.08.07 13:39 
Unter D5 war die VCL noch nicht für so große Dateien ausgelegt; hab's grad selber in den VCL-Sources nachgeschaut.

Die einzige Möglichkeit, die Du da hast, ist die TFileStream-Implementation dir schnell selber auf 64-Bit-Größen zu schreiben.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
TheUnknown Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 334



BeitragVerfasst: Do 30.08.07 13:56 
user profile iconBenBE hat folgendes geschrieben:
Unter D5 war die VCL noch nicht für so große Dateien ausgelegt; hab's grad selber in den VCL-Sources nachgeschaut.

Die einzige Möglichkeit, die Du da hast, ist die TFileStream-Implementation dir schnell selber auf 64-Bit-Größen zu schreiben.


Ja, Longint, hab auch schon gefunden - darum fragte ich ja, ob mir jmd helfen kann, einen Workaround zu basteln... :)
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.