Delphi-Quellcode:
var
aFileStream: TFileStream;
Buffer: array[1..16*1024] of Byte; // 16 KB
BytesReadCount: Integer;
begin
if not DirectoryExists(ExtractFilePath(ParamStr(0)) + 'Files') then
MkDir(ExtractFilePath(ParamStr(0)) + 'Files\' + Store);
aFileStream := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'Files\' + FileName, fmCreate);
try
repeat
BytesReadCount := str.Read(Buffer, SizeOf(Buffer));
aFileStream.Write(Buffer, BytesReadCount);
until BytesReadCount < SizeOf(Buffer);
finally
aFileStream.Free;
end;
end;
Beschreibung:
- fmCreate überschreibt bestehende Dateien ... es ist also nicht nötig diese vorher zu löschen
- Das .Create gehört vor den Try-Finally-Block, denn wenn es vor dem .Create schon knallt, dann knallt es im Finally nochmals beim .Free, da die Variable nicht initialisiert hattest.
> Tipp: Hör auf das, was dir der Compiler sagt, denn der hat dich ganz bestimmt gewarnt.
Ausnahme: Man initialisiert die Variable vorher entsprechend mit NIL.
- Dynamische Arrays (z.B. TBytes) und Strings muß man nicht unbedingt manuell freigeben.
Vorallem wenn Delphi das eine Millisekune später auch nochmal macht ... Im geheimen/unsichtbaren END-Code deiner Methode.
- Da du eh mit einer Konstanten Puffergröe arbeitest, kannst du den Puffer auch gleich konstannt erstellen.
> 16 KB sollten locker nich mit noch auf deinen Stack drauf passen ... wenn nicht, dann stimmt eh irgendwo etwas nicht.
- 1 KB ist eh etwas "suboptimal"
DataSnap hat standardmäßig einen Übertragungspuffer von 32 KB und auch die Clustergröße deiner Festplatte (die Größe der Verwaltungseinheiten) wird bei dir bestimmt mehr als ein 1 KB sein.
- Name > FileName
- das Success ist vollkommen "sinnlos"
- Erstemal kannst du deine werte direkt an result übergeben und brauchst keine susätzliche Variable.
(ist nicht wie beim Return in C, PHP, JS und Co., wo bei dessen Zuweisung die Prozedur beendet wird)
- außerdem gibt dein Resul keinen "sinnvolen" Wert zurück.
- es gibt True zurück, wenn alles (vermutlich) erfolgreich war
(ist nicht wie beim Return in C, PHP, JS und Co., wo bei dessen Zuweisung die Prozedur beendet wird)
- bei einem Fehler gibt es eine Exception und das Result wird nicht verwendet
Also reicht eine Proedure ... Fehler werden ja eh als Exception zurückgegeben.
Die Exceptions jetzt abzufangen (try-except) wäre ganz schlimm, denn ein Boolean sagt nur daß etwas falsch lief,
aber die Exception, welche gesagt hätte was genau nichtr ging, hätte man dann geschrottet.
Im Server also einfach procedure UploadFile(Stream: TStream; StorePath, FileName: string);
verwenden.
PS: Sollte die Datei
im Store-Pfad liegen, oder hab ich das falsch verstanden?
Wenn ja, dann muß "Store" natürlich noch mit in den Pfad des TFileStream.Create aufgenommen werden.
Zitat:
Das wird auch jedesmal wenn ich eine neue Methode implementiere überschrieben.
Du mußt das ja auch im Server ändern ... dann wird es im Clienten richtig importiert.