Autor |
Beitrag |
Biarchiv
      
Beiträge: 688
|
Verfasst: 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?
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
      
Beiträge: 133
Win XP
D5
|
Verfasst: Do 27.09.07 16:08
hi,
guck dir am besten mal dieses Tutorial an: dsdt.info/tutorials/streams/?page=3
Blaueled
|
|
Biarchiv 
      
Beiträge: 688
|
Verfasst: Do 27.09.07 17:54
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
      
Beiträge: 133
Win XP
D5
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 28.09.07 10:04
Biarchiv hat folgendes geschrieben: | 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: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 688
|
Verfasst: Fr 28.09.07 15:23
BenBE 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 28.09.07 15:31
Biarchiv 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.
|
|
|