![]() |
![]() ![]() ![]() ![]() |
|
Некоторые модификации методов ReadSection и ReadSections объекта, типа TIniFileDelphi , Файловая система , INI файлы
Автор: VID
{ **** UBPFD *********** by delphibase.endimus.com ****
>>
Отличие функции ReadSectionEx от метода ReadSection, объекта типа TIniFile,
заключается в том, что размер буффера для сохранения содержимого файла,
не является константой (16Кб, в модуле IniFiles.pas), а представляет собой
переменную величину, значение которой равно размеру файла инициализации
(IniFileName). Таким образом решается проблема, с нехваткой выдыленного
размера оперативной памяти для операции чтения содержимого секции (SectionName).
Так же, в случае успешнонго выполнения чтения секции Ini-файла, функция
возвращает количество строк в заполненном списке (Strings)
Функция ReadSectionsEx имеет те же отличия от метода ReadSection, что и функция
ReadSectionEx от метода ReadSection. Функция ReadSectionsEx помещает в список
Strings все секции указанного INI-файла (IniFileName)
Зависимости: Windows, SysUtils, Classes, IniFiles
Автор: VID, vidsnap@mail.ru, ICQ:132234868, Махачкала
Copyright: VID (базируется на коде соответствующих методов, в модуле IniFiles.pas)
Дата: 24 мая 2002 г.
***************************************************** }
unit INIExtension;
interface
uses Windows, SysUtils, Classes, IniFiles;
function ReadSectionsEx(IniFileName: string; Strings: TStrings): Integer;
function ReadSectionEx(IniFileName: string; SectionName: string;
Strings: TStrings): Integer;
implementation
function ReadSectionsEx(IniFileName: string; Strings: TStrings): Integer;
var
BufSize: Integer;
SR: TSearchRec;
buffer, P: Pchar;
begin
Result := -1;
if not FileExists(IniFileName) then
EXIT;
FindFirst(IniFileName, faAnyFile, SR);
BufSize := Sr.Size;
FindClose(SR);
GetMem(Buffer, BufSize);
try
Strings.BeginUpdate;
try
Strings.Clear;
if GetPrivateProfileSectionNames(buffer, BufSize,
Pchar(IniFileName)) <> 0 then
begin
P := Buffer;
while P^ <> #0 do
begin
Strings.Add(P);
Inc(P, StrLen(P) + 1);
end;
end;
Result := Strings.Count;
finally
Strings.EndUpdate;
end;
finally
FreeMem(Buffer, BufSize)
end;
end;
function ReadSectionEx(IniFileName: string; SectionName: string;
Strings: TStrings): Integer;
var
BufSize: Integer;
SR: TSearchRec;
buffer, P: Pchar;
begin
Result := -1;
FindFirst(IniFileName, faAnyFile, SR);
BufSize := Sr.Size;
FindClose(SR);
GetMem(Buffer, BufSize);
try
Strings.BeginUpdate;
try
Strings.Clear;
if GetPrivateProfileString(PChar(SectionName), nil, nil, Buffer, BufSize,
PChar(IniFileName)) <> 0 then
begin
P := Buffer;
while P^ <> #0 do
begin
Strings.Add(P);
Inc(P, StrLen(P) + 1);
end;
end;
Result := Strings.Count;
finally
Strings.EndUpdate;
end;
finally
FreeMem(Buffer, BufSize)
end;
end;
end.
Пример использования:
var
TargetList: TStringList;
Ini: TIniFile;
begin
TargetList := TStringList.create;
Ini := TiniFile.create('system.ini');
//Заполняем список TargetList параметрами секции boot
ReadSectionEx(Ini.FileName, 'Boot', TargetList);
//Заполняем список TargetList именами всех секций
ReadSectionsEx(Ini.FileName, TargetList);
Ini.Free;
TargetList.Free;
end;
Перевод: Код, предоставленный ниже, является расширением встроенного компонента Delphi Расшифровка каждой функции:
Основные отличия этих функций от стандартных методов
Эти изменения могут быть полезны при работе с большими файлами INI или при необходимости иметь больше контроля над процессом чтения. Пример использования, предоставленный ниже, демонстрирует, как использовать эти функции для чтения секций из файла INI. Он создает объект Однако в этом коде есть некоторые потенциальные проблемы:
Вот обновленная версия функций с учетом этих проблем: Вот обновленный пример использования: В этом коде предполагается, что файл INI существует и может быть прочитан. Если это не так, он выйдет без чтения ничего. Более robust версия кода включала бы обработку ошибок для этих случаев. Некоторые модификации методов ReadSection и ReadSections объекта, типа TIniFile, позволяют решать проблемы нехватки оперативной памяти при чтении содержимого секций INI-файла. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 | ||||