Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
ВнизБольшой текстовый файл Найти похожие ветки
← →
ИМХО © (2004-07-20 16:24) [0]Имеется большой текстовый файл (больше 1 Гб). Как работать с ним? Если загружать в TStringList, то не хватит никакой памяти.
← →
Smithson © (2004-07-20 16:29) [1]Загружать частями.
Например, воспользоваться File of string и циклом.
← →
LM2 (2004-07-20 16:36) [2]TFileStream
← →
ЮрийК © (2004-07-20 16:36) [3]Приводили уже как-то:
unit MappedFile;
interface
uses
Windows, SysUtils;
type
TMappedFile = class
private
FHandle : DWORD;
FMapping : DWORD;
FSize : DWORD;
FView : PChar;
FActive : Boolean;
FName : string;
procedure SetSize(const Value : DWORD);
procedure SetName(const Value : string);
procedure SetActive(const Value : Boolean);
function GetActive : Boolean;
public
constructor Create;
destructor Destroy; override;
procedure Close;
procedure Open;
property Size : DWORD read FSize write SetSize;
property Data : PChar read FView;
property Active : Boolean read GetActive write SetActive;
property Name : string read FName write SetName;
end;
implementation
constructor TMappedFile.Create;
begin
FHandle := INVALID_HANDLE_VALUE;
FName := "";
end;
destructor TMappedFile.Destroy;
begin
Close;
inherited;
end;
procedure TMappedFile.SetName(const Value : string);
begin
if Active then
raise Exception.Create("Íåëüçÿ èçìåíèòü èìÿ!");
FName := Value;
end;
procedure TMappedFile.SetSize(const Value : DWORD);
begin
if Active then
raise Exception.Create("Íåëüçÿ èçìåíèòü ðàçìåð!");
FSize := Value;
end;
procedure TMappedFile.SetActive(const Value : Boolean);
var
sz : DWORD;
begin
if FActive = Value then Exit;
if Value then
begin
FHandle := CreateFile(
PChar(FName),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
FILE_FLAG_RANDOM_ACCESS,
0);
if FHandle = INVALID_HANDLE_VALUE then
RaiseLastOSError;
sz := GetFileSize(FHandle, nil);
if FSize > sz then
begin
SetFilePointer(FHandle, FSize, nil, FILE_BEGIN);
SetEndOfFile(FHandle);
SetFilePointer(FHandle, 0, nil, FILE_BEGIN);
end
else
FSize := sz;
FMapping := CreateFileMapping(
FHandle,
nil,
PAGE_READWRITE,
0, FSize,
nil);
if FMapping = 0 then
begin
CloseHandle(FHandle);
FHandle := INVALID_HANDLE_VALUE;
RaiseLastOSError;
end;
FView := MapViewOfFile(
FMapping,
FILE_MAP_ALL_ACCESS,
0, 0,
0);
if FView = nil then
begin
CloseHandle(FHandle);
CloseHandle(FMapping);
FHandle := INVALID_HANDLE_VALUE;
FMapping := 0;
RaiseLastOSError;
end;
FSize := GetFileSize(FHandle, nil);
end
else
begin
UnmapViewOfFile(FView);
CloseHandle(FMapping);
CloseHandle(FHandle);
FView := nil;
FMapping := 0;
FHandle := INVALID_HANDLE_VALUE;
end;
FActive := Value;
end;
function TMappedFile.GetActive : Boolean;
begin
Result := FHandle <> INVALID_HANDLE_VALUE;
end;
procedure TMappedFile.Open;
begin
Active := True;
end;
procedure TMappedFile.Close;
begin
Active := False;
end;
end.
← →
Fay © (2004-07-20 18:00) [4]Знакомый код 8)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.033 c