hat jemand zufällig ein Beispiel wie ich einen TStream in einen String konvertiere?
Ich habe eine Funktion, die aus einer Datei einen Stream erstellt und anschließend ausliest.
Code: Alles auswählen
Stream := TFileStream.Create('chunk', fmOpenRead);
Code: Alles auswählen
Stream := TFileStream.Create('chunk', fmOpenRead);
chickendev hat geschrieben:Wie ließe sich das realisieren damit aus einem String ein TStream wird?
Zu welchem Zweck? Bist du sicher, dass du genau das willst?chickendev hat geschrieben: hat jemand zufällig ein Beispiel wie ich einen TStream in einen String konvertiere?
Code: Alles auswählen
procedure InitiateUpload(FileName : String);
var
MyFile: file;
Data: array [0..(CHUNKSIZE-1)] of Byte;
Chunk : String;
MD5Chunk, SHA1Chunk : String;
LeftFileSize, ThisChunkSize: Integer;
begin
LeftFileSize := getFileSize(FileName);
AssignFile(MyFile, FileName);
FileMode := fmOpenRead;
Reset(MyFile, 1);
try
while not EOF(MyFile) do
begin
if LeftFileSize > CHUNKSIZE then
begin
//ShowMessage('Read '+IntToStr(SizeOf(Data))+' with Left: '+IntToStr(LeftFileSize));
BlockRead(MyFile, Data, SizeOf(Data));
Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+1;
ThisChunkSize := CHUNKSIZE;
end else
begin
//ShowMessage('Read '+IntToStr(LeftFileSize)+' with Left: '+IntToStr(LeftFileSize));
BlockRead(MyFile, Data, LeftFileSize);
Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+1;
ThisChunkSize := LeftFileSize;
end;
Chunk := PChar(@Data[0]);
MD5Chunk := UpperCase(MD5Print((MD5String(Chunk))));
SHA1Chunk := UpperCase(SHA1(Chunk));
//Ausgabe in der Konsole
Form1.LogMemo.Text := Form1.LogMemo.Text + IntToStr(Form1.ProgressBar1.Position)+'/'+IntToStr(Form1.ProgressBar1.Max)+' - MD5:'+MD5Chunk+' SHA1:'+SHA1Chunk+' with '+IntToStr(ThisChunkSize)+' Bytes';
//Verfügbarkeit Testen
if testAvailability ( MD5Chunk, SHA1Chunk, IntToStr(ThisChunkSize)) then begin
Form1.LogMemo.Text := Form1.LogMemo.Text + '- verfügbar'+#13#10;
end else begin
Form1.LogMemo.Text := Form1.LogMemo.Text + '- nicht verfügbar'+#13#10;
ShowMessage(sendChunk(Chunk));
end;
//Jetzt ggf uploaden..
LeftFileSize := LeftFileSize - CHUNKSIZE;
end;
finally
CloseFile(MyFile);
end;
end;
Code: Alles auswählen
function sendChunk (Data : String) : String;
var
Stream: TStream;
List: TStringList;
Response : String;
DStream : TStream;
begin
Stream := TFileStream.Create('chunk', fmOpenRead);
List:=TStringList.Create;
HttpPostFile('http://xyz.php?auth='+AUTHKEY, 'chunk', 'chunk', Stream, List);
Response := List.Text;
Stream.Free;
List.Free;
Result := Response;
end;
Code: Alles auswählen
Chunk := PChar(@Data[0]);
Ich spar mir den ganzen Code.chickendev hat geschrieben:Ich bin derzeit noch nicht in der Lage aus einem String einen Stream zu erzeugen
Code: Alles auswählen
Strm.WriteBuffer(strng[1],length(strng));
Danke, ich habe inzwischen festgestellt das ich einen dicken Denkfehler in der ganzen Sache habe, bei den eingelesenen Daten handelt es sich um binäre Daten und die length()-Funktion bei Binären Daten falsche Werte an.theo hat geschrieben:Ich spar mir den ganzen Code.chickendev hat geschrieben:Ich bin derzeit noch nicht in der Lage aus einem String einen Stream zu erzeugen
Die Antwort auf diese Frage:
Code: Alles auswählen
Strm.WriteBuffer(strng[1],length(strng));
Die length()-Funktion liefert immer die Länge des Strings oder Arrays als Anzahl der Elemente. Bei Ansistrings (Standard mit Compilerschlater {$H+}) ist ein Element vom Typ Char genau so groß wie ein Element des Typs Array of Byte, nämlich genau 1 Byte. Da die Länge des Strings unabhängig von dessen Inhalt ist und auch so gespeichert wird, erhältst du hier immer korrekte Werte. Du musst natürlich vorher die Länge auf die gewünschte Größe setzen (mit SetLength()).chickendev hat geschrieben:Danke, ich habe inzwischen festgestellt das ich einen dicken Denkfehler in der ganzen Sache habe, bei den eingelesenen Daten handelt es sich um binäre Daten und die length()-Funktion bei Binären Daten falsche Werte an.