Entwickler-Ecke
Dateizugriff - TFileStream "Writebuffer" "CopyFrom" "CopyTo" zu groß
Biarchiv - Do 27.09.07 15:13
Titel: TFileStream "Writebuffer" "CopyFrom" "CopyTo" zu groß
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; |
Biarchiv - 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 - 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 - Fr 28.09.07 10:04
Titel: Re: TFileStream "Writebuffer" "CopyFrom" "CopyTo" zu groß
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 - 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.
Biarchiv - 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 - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!