Hallo ,
ich habe eine Frage zu dem Code , den ich letztens geschrieben habe , um Dateiübertragungen auf den
"alten" ( Delphi 6 ) Winsocks zu realisieren ( ich hab' das Versenden von Dateien auch schon mit
Streams ausprobiert , baer nach max. 740 KB hat die Übertragung jedesmal abgebrochen..ein paar
befreundete Programmierer meinten dazu , dass ich einfach auf
Indy umsteigen soll , was aber
aufgrund der Größe des schon geschriebenen Codes für mich reichlich unpraktisch ist ...).
Zum besseren Verständnis beschreibe ich hier erstmal meine Methode dabei :
Da bei mir die Konvertierung von Dateien in Strings immer wieder felgeschlagen ist , habe ich mich
entschieden , die Datei auf der Byte Ebene auszulesen und diese Werte in einen String zu packen (
mit der kleinen Eigenheit , dass ich jeden Bytewert auf drei Stellen bringe , dann fällt mir das
auslesen am anderen Ende der Leitung leichter^^) , den ich dann mit
clientsocket.socket.sendtext("filestring")[i] verschicke und am anderen Ende auslese,in eine
Datei schreibe und dann ins ursprüngliche Format konvertiere.
Jetzt würde ich gerne wissen ob und wie man die Konvertierung von bytewerten zu einer Zeichenkette
optimieren kann und was man dafür tun muss , denn die Konvertierung von einer Datei zu einem String
dauert , wenn diese größer 1MB ist , schon ziemlich lange ( >3min. auf einem 300+ Athlon XP ) und
ich müsste diesen Prozess eigentlich noch um einiges beschleunigen...
Hier mein Konvertierungsquellkode :
var
fn:string; // filename
streamconv:Tstream; // Stream für die Originaldatei
countbytes:integer; // zur Positionskonrolle
readtostr:integer; // Buffer zum Lesen vom Stream
strbuffer:string; // für die Konvertierung vom Buffer ( Integer ) zum filestring ( String )
transferstr:string; // String für den endgültigen Dateitransfer
begin
streamconv:=Tfilestream.create(fn,fmopenread);
countbytes:=0;
transferstr:='';
repeat
begin
// setzen von countbytes
countbytes:=countbytes+1;
// lesen und umwandeln in string
streamconv.read(readtostr,1);
strbuffer:=inttostr(readtostr);
// formatieren
if length(strbuffer)=3
then
begin
transferstr:=transferstr+strbuffer;
strbuffer:='';
end
else
begin
if lengt(strbuffer)=2
then
begin
strbuffer:='0'+strbuffer;
transferstr:=transferstr+strbuffer;
strbuffer:='';
end;
if length(strbuffer)=1
then
begin
strbuffer:='00'+strbuffer;
transferstr:=transferstr+strbuffer;
strbuffer:='';
end;
if length(strbuffer)=0
then
begin
log.lines.add('error in file : '+fn+' @ pos : '+inttostr(countbytes));
strbuffer:='';
end;
end;
end;
until countbytes=streamconv.size;
streamconv.free;
countbytes:=0;
// verschicken
transferstr:='';
Ich wäre demjenigen , der mir ein bisschen weiterhelfen könnte wirklich sehr dankbar...
Mfg, Lord of Ghosts