Trong khi chuyển một số mã từ Delphi 7 sang Delphi 2010, tôi đã viết lại hàm LoadTextFromFile() của mình.Delphi 2010 có chức năng LoadTextFromFile không?
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;
Khi một ý nghĩ đánh vào đầu tôi: phải có thứ gì đó như thế này trong thư viện chuẩn. Nhiều người dùng muốn đọc một tệp văn bản thành một chuỗi, nhưng tôi không thể tìm thấy một hàm chuẩn như vậy. Gần nhất tôi đến là sử dụng TStringlist để tải văn bản. Nhưng A) tạo ra một TStringlist trông không cần thiết và B) Tôi không muốn bị chi phí từ TStringlist.
Câu hỏi: có chức năng LoadTextFromFile tiêu chuẩn trong Delphi 2010 không?
Ngay cả trong Delphi 7, bạn không cần phải làm tất cả những gì. Sử dụng 'TStringStream' thay vì' TFileStream' và sử dụng câu trả lời của Marco. Ngoài ra, tôi tò mò: Trong trường hợp nào bạn đã từng thấy rằng thuộc tính 'Position' không phải là 0 ngay lập tức sau khi tạo một luồng, sao cho bạn cần phải trừ nó khỏi' Kích thước' để tính 'lSize'? –
Hi Rob, Trong Delphi 7 Tôi đã có thể tải/lưu vào các tập tin UTF8. Và quan trọng hơn là tôi không biết về TStringStream. Vị trí không cần phải ở đó. Đó là vì tôi đã sao chép một số mã trong phương thức TStrings.Loadfromstream có vị trí trong đó. Ngoài ra còn có một lỗi trong mã của tôi vì nó không xử lý các tập tin với BOM. Vì vậy, bất cứ ai nghĩ về việc sử dụng ví dụ của tôi: không. Sử dụng TFile.ReadAllText thay thế. –