Autor Beitrag
Biarchiv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: Do 27.09.07 15:13 
Hallo,

ich bekomme ab und zu einen "Stream Fehler" Nachricht obwohl der Code funktioniert.
Nur manchmal. Egal ob WriteBuffer oder CopyFrom. Wenn es zu groß ist mag Delphi
das nicht.

Ich bin trauf gekommen das das problem in der angegeben größe liegt.

Gibt es da bekannte Grenzen?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
       fsFrom:= TFileStream.Create('w.w', fmOpenRead);
       fsTo:= TFileStream.Create(w.w, fmOpenWrite);
       fsFrom.Position:= 0;
       fsTo.Position:= 0;
       fsTo.CopyFrom(fsFrom, 5000000);
       byteBuffer := 255;
       CDatei.WriteBuffer(byteBuffer, 5000000);
       fsFrom.Free;
       fsTo.Free;
blaueled
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 133

Win XP
D5
BeitragVerfasst: Do 27.09.07 16:08 
hi,

guck dir am besten mal dieses Tutorial an: dsdt.info/tutorials/streams/?page=3

Blaueled
Biarchiv Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: Do 27.09.07 17:54 
user profile iconblaueled hat folgendes geschrieben:
hi,

guck dir am besten mal dieses Tutorial an: dsdt.info/tutorials/streams/?page=3

Blaueled


Hallo,

ich sehe das ich WriteBuffer und CopyFrom mit "length" definieren sollte.

Währe es eine gute Lösung einen Buffer per
[0..5000000] in var die größe zu definieren?
blaueled
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 133

Win XP
D5
BeitragVerfasst: Do 27.09.07 21:30 
Ähm,
ich verstehe nicht so genau, was du meinst:
Wenn du den gesamten stream kopieren möchtest, dann musst du im Einfachsten Fall Count (den 2. Parameter) auf 0 setzten.

Andernfalls und bei WriteBuffer immer, gibt Count die Anzahl der zu kopierenden Bytes an.

d.h. wenn deine Datei kleiner als 5.000.000 Bytes ist, dann wird der Code funktionieren. Andernfalls werden eben nur 5 MB kopiert.

SizeOf(x) wird verwendet, um die "Dateigröße" zu ermitteln. Das müsstest du dann bei WriteBuffer tun.

BlaueLED
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 28.09.07 10:04 
user profile iconBiarchiv hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
       fsFrom:= TFileStream.Create('w.w', fmOpenRead);
       fsTo:= TFileStream.Create(w.w, fmOpenWrite);
       fsFrom.Position:= 0;
       fsTo.Position:= 0;
       fsTo.CopyFrom(fsFrom, 5000000);
       byteBuffer := 255;
       CDatei.WriteBuffer(byteBuffer, 5000000);
       fsFrom.Free;
       fsTo.Free;
Hier liegt dein Fehler... Die Größe der Variablen byteBuffer (das ist der zweite Parameter von WriteBuffer ;-)) ist bestimmt nicht 5 Millionen Byte, denn das muss ja eine Zahl sein, sonst hättest du vorher nicht 255 zuweisen können...
Richtig wäre:
ausblenden Delphi-Quelltext
1:
       CDatei.WriteBuffer(byteBuffer, SizeOf(byteBuffer));					
Was CDatei ist kann man aus dem Quelltext-Schnipsel zwar nicht ersehen, aber wenn das ansonsten ein korrekt benutzter Stream ist, dann sollte es mit der Korrektur gehen. (Wobei aus dem Quelltext ja auch nicht ersichtlich ist was CDatei mit den beiden Streams, in denen kopiert wird, zu tun hat...)
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: Fr 28.09.07 14:49 
Welche Delphi-Version nutzt Du?

Delphi vor Version 7 ist rein von der VCL her nicht für große Dateien geeignet.

_________________
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.
Biarchiv Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: Fr 28.09.07 15:23 
user profile iconBenBE hat folgendes geschrieben:
Welche Delphi-Version nutzt Du?

Delphi vor Version 7 ist rein von der VCL her nicht für große Dateien geeignet.


Hallo,

hab D2006 Pro nachgerüstet. Bei D5 hatte ich schon mit großen Dateien probleme.

WriteBuffer mit sizeof ist klar. Stimmt.

Bei CopyFrom bin ich auch traufgekommen. Wenn die Datei kleiner als
5000000 ist gibt es einen Stream-Fehler. CDatei ist TFileStream.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 28.09.07 15:31 
user profile iconBiarchiv hat folgendes geschrieben:
Bei CopyFrom bin ich auch traufgekommen. Wenn die Datei kleiner als
5000000 ist gibt es einen Stream-Fehler. CDatei ist TFileStream.
Dann gib einfach die Größe des Streams an, wenn du möchtest, dass der gesamte Stream kopiert wird. Also fsFrom.Count.