Oooookay... dummer Fehler meinerseits
:
Wenn sich Steuerzeichen wie z.B. #13#10 in dem String befinden, werden diese natürlich auch in der Stringliste widergespiegelt. Dementsprechend sieht es nicht mehr Key/Value-technisch so aus:
Delphi-Quellcode:
CopyFile=T
FileSize=1234
BytesRead=1234
Data=abcdefg#13#10hijklmn
sondern mehr so:
Delphi-Quellcode:
CopyFile=T
FileSize=1234
BytesRead=1234
Data=abcdefg
hijklmn
Daher hatte ich nun in einem ersten Ansatz so gearbeitet, dass ich den Wert aus Data genommen habe und mittels einer Schleife den Inhalt aller nachfolgenden Zeilen der Stringliste (inklusive #13#10) ergänzt.
Diese unsaubere Methode gefiel mir nicht so wirklich und dann wurde mir bewusst, dass ich doch den String auch direkt aus dem Variant abgreifen kann, den ich dank des DataRequests erhalte. Das bedeutet, meine Schreibmethode sieht nun so aus:
Delphi-Quellcode:
[...]
loc_FileSize := 0;
loc_Position := 0;
if FileExists(aDestDir + ExtractFileName(FFileList[loc_i])) then
loc_fs := TFileStream.Create(aDestDir + ExtractFileName(FFileList[loc_i]), fmOpenWrite)
else
loc_fs := TFileStream.Create(aDestDir + ExtractFileName(FFileList[loc_i]), fmCreate);
try
loc_fs.Seek(0, soBeginning);
repeat
loc_drq := 'CMD=' + DRQ_TransferFile + ',' +
'FileName=' + 'C:\DummyFile.txt' + ',' +
'Position=' + IntToStr(loc_Position);
loc_v := cdsLogFiles.DataRequest(loc_drq);
loc_Result := GnDataRequestResult(DRQ_TransferFile, loc_v, loc_sl);
if (loc_Result) then begin
loc_FileSize := StrToIntDef(loc_sl.Values['FileSize'], 0);
loc_BytesRead := StrToIntDef(loc_sl.Values['BytesRead'], 0);
loc_s := Copy(VarToStr(loc_v), Pos('DATA=', VarToStr(loc_v)) + 5, loc_BytesRead);
{$WARN UNSAFE_CODE OFF}
loc_c := @loc_s[1];
{$WARN UNSAFE_CODE ON}
try
loc_fs.WriteBuffer(loc_c^, loc_BytesRead);
except
loc_Error := GetLastError;
MessageDlg(
'Can not write file. Error ' + IntToStr(loc_Error),
mtError, [mbOk], 0
);
loc_Result := False;
end;
Inc(loc_Position, loc_BytesRead);
end;
until (FCancelled) or (not loc_Result) or (loc_Position >= loc_FileSize);
finally
FreeAndNil(loc_fs);
end;
So funktioniert das ganze seeeeehr gut
und dann klappt's auch mit dem Nachbarn