Tôi có chức năng "Tìm tệp" trong chương trình của tôi để tìm tệp văn bản có hậu tố .ged mà chương trình của tôi đọc. Tôi hiển thị kết quả tìm thấy trong một cửa sổ thật bắt mắt trông như thế này:Làm thế nào tôi có thể đọc một cách hiệu quả FIrst Vài dòng của nhiều tệp trong Delphi
tôi sử dụng phương pháp FindFirst/FindNext tiêu chuẩn, và các công trình này rất nhanh chóng. 584 tệp được hiển thị ở trên được tìm thấy và hiển thị trong vài giây.
Điều tôi muốn làm là thêm hai cột vào màn hình hiển thị "Nguồn" và "Phiên bản" được chứa trong mỗi tệp này. Thông tin này thường được tìm thấy trong 10 dòng đầu tiên của mỗi tệp, trên các dòng giống như sau:
1 SOUR FTM
2 VERS Family Tree Maker (20.0.0.368)
Bây giờ tôi không phân tích vấn đề này một cách nhanh chóng, và đó không phải là những gì tôi yêu cầu.
Điều tôi cần trợ giúp chỉ đơn giản là cách tải nhanh nhất 10 dòng đầu tiên từ những tệp này xuống để tôi có thể phân tích cú pháp chúng.
Tôi đã cố gắng thực hiện một StringList.LoadFromFile, nhưng phải mất quá nhiều thời gian tải các tệp lớn, chẳng hạn như những tệp ở trên 1 MB.
Vì tôi chỉ cần 10 dòng đầu tiên hoặc hơn, làm thế nào để tôi có được chúng tốt nhất?
Tôi đang sử dụng Delphi 2009 và các tệp nhập của tôi có thể hoặc có thể không phải là Unicode, vì vậy điều này cần phải hoạt động đối với bất kỳ mã hóa nào.
followup: Cảm ơn Antonio,
tôi đã kết thúc làm điều này mà hoạt động tốt:
var
CurFileStream: TStream;
Buffer: TBytes;
Value: string;
Encoding: TEncoding;
try
CurFileStream := TFileStream.Create(folder + FileName, fmOpenRead);
SetLength(Buffer, 256);
CurFileStream.Read(Buffer[0], 256);
TEncoding.GetBufferEncoding(Buffer, Encoding);
Value := Encoding.GetString(Buffer);
...
(parse through Value to get what I want)
...
finally
CurFileStream.Free;
end;
TStrings.LoadFromFile rất kém hiệu quả, hãy quên nó đi. Hãy suy nghĩ ra khỏi hộp và đọc hợp lý (ví dụ: NumLines * AvgLineLength) số byte, cắt ngắn với LineStart và sau đó chia thành TStrings –
Thực ra, Worm, nó không tệ như bạn nghĩ. Nó có thể đọc và tải khoảng 10 MB một giây. Tôi vẫn sử dụng thành công nó khi tôi phải tìm kiếm các văn bản trong những tập tin đó. Nhưng tại sao lại sử dụng nó để tải toàn bộ tập tin và khiến người dùng chờ 40 giây khi chỉ cần vài dòng đầu tiên là cần thiết. – lkessler