Während ich etwas Code von Delphi 7 nach Delphi 2010 portierte, schrieb ich meine LoadTextFromFile() Funktion um.Hat Delphi 2010 eine LoadTextFromFile-Funktion?
function LoadTextFromFile(const aFullFileName: string): string;
var
lBuffer: TBytes;
lEncoding: TEncoding;
lFileStream: TFileStream;
lSize: Integer;
begin
if not FileExists(aFullFileName) then
begin
raise Exception.Create('File "' + aFullFileName + '" not found.');
end;
lFileStream := TFileStream.Create(aFullFileName, fmOpenRead + fmShareDenyNone);
try
if lFileStream.Size <= 0 then
begin
Result := '';
end
else
begin
lSize := lFileStream.Size - lFileStream.Position;
SetLength(lBuffer, lSize);
// Read file into TBytes buffer
lFileStream.Read(lBuffer[0], lSize);
// Read encoding from buffer
TEncoding.GetBufferEncoding(lBuffer, lEncoding);
// Get string from buffer
Result := lEncoding.GetString(lBuffer);
end;
finally
lFileStream.Free;
end;
end;
Wenn mir ein Gedanke durch den Kopf schlagen war: Es muss so etwas wie dies in der Standardbibliothek sein. Viele Benutzer möchten eine Textdatei in eine Zeichenfolge lesen, aber ich konnte eine solche Standardfunktion nicht finden. Am nächsten kam ich mit TStringlist, um Text zu laden. Aber A) das Erstellen einer TStringlist sieht unnötig aus und B) Ich möchte nicht den Overhead von TStringlist erleiden.
Frage: Gibt es eine standardmäßige LoadTextFromFile-Funktion in Delphi 2010?
Auch in Delphi 7, Sie nicht alles, was zu tun hatte. Verwenden Sie einen 'TStringStream' anstelle von' TFileStream' und verwenden Sie Marcos Antwort. Ich bin auch neugierig: Unter welchen Umständen haben Sie jemals festgestellt, dass die 'Position'-Eigenschaft unmittelbar nach dem Erstellen eines Streams nicht Null war, so dass Sie sie von' Size' abziehen müssten, um 'lSize' zu berechnen? –
Hallo Rob, in Delphi 7 musste ich in UTF8-Dateien laden/speichern können. Und noch wichtiger: Ich wusste nichts von TStringStream. Die Position muss nicht da sein. Es ist da, weil ich etwas Code aus der TStrings.Loadfromstream-Methode kopiert habe, die die Position darin hat. Es gibt auch einen anderen Fehler in meinem Code, da er keine Dateien mit BOM verarbeitet. Also jemand, der darüber nachdenkt, mein Beispiel zu verwenden: nicht. Verwenden Sie stattdessen TFile.ReadAllText. –