Du weißt, dass DropFileTarget1.Files.SaveToStream aka StringList.SaveToStream
die Liste der Dateinamen ist, und nicht der Inhalt dieser Datei?
SaveToFile/SaveToStream sollte beim TMemoryStream (eigentlich) immer den kompletten Inhalt speichern,
aber grundsätzlich kann es nicht schaden, es auf den Anfang zu setzen.
z.B. TBitmap.LoadFromStream/SaveToStream arbeitet von der aktuellen Position aus
und nach DropFileTarget1.Files.SaveToStream steht der Zeiger hinter den eingefügten Daten.
Delphi-Quellcode:
mem.Position := 0;
mem.SaveToFile(FilepathB);
Warum ein TMemoryStream mit anschließendem SaveToFile, anstatt direkt ein TFileStream?
PS:
TFile.Create aus System.IOUtils
Mit "Create" auf die Datei bezogen, nicht auf den Stream, also auch .Open, .OpenRead, .OpenWrite oder .Append
Delphi-Quellcode:
Stream := TFile.Create(TPath.Combine(Zielpfad, FileName)); // oder eben := TFileStream.Create(...);
try
DropFileTarget1.Files.SaveToStream(Stream);
finally
Stream.Free;
end;
Delphi-Quellcode:
class function TForm25.GetShortName(Filename: string): string;
begin
// Check size and contact storage manager(s)
SetLength(Result, GetShortPathName(PChar(Filename), nil, 0) - 1);
// only fill the variable content (no interaction with the memory manager)
GetShortPathName(PChar(Filename), PChar(Result), Length(Result) + 1);
end;
class function TForm25.GetShortName(Filename: string): string;
begin
// Check size and contact storage manager(s)
SetLength(Result, GetShortPathName(PChar(Filename), nil, 0));
// Fill variable content,
// reserve new memory,
// copy content
// and release old memory
SetLength(Result, Integer(GetShortPathName(PChar(Filename), PChar(Result), Length(Result))) - 1);
end;
class function TForm25.GetShortName(Filename: string): string;
var
Len: Integer;
begin
// Check size
Len := GetShortPathName(PChar(Filename), nil, 0);
// and contact storage manager(s)
SetLength(Result, Len);
// Fill variable content,
Len := GetShortPathName(PChar(Filename), PChar(Result), Len);
// change the size of the reserved memory (if inplace is not possible, then reserve new memory, copy content and release old memory)
SetLength(Result, Len);
// if truncated, then reserve new memory, copy content and release old memory
Result := Trim(Result);
end;