AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi FileStream.WriteBuffer für binäre Daten in einem String
Thema durchsuchen
Ansicht
Themen-Optionen

FileStream.WriteBuffer für binäre Daten in einem String

Ein Thema von crowley · begonnen am 25. Mai 2009 · letzter Beitrag vom 29. Mai 2009
 
crowley

Registriert seit: 7. Jun 2006
Ort: Emmerich
9 Beiträge
 
#2

Re: FileStream.WriteBuffer für binäre Daten in einem String

  Alt 29. Mai 2009, 13:46
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
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz