Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Некоторые модификации методов ReadSection и ReadSections объекта, типа TIniFile

Delphi , Файловая система , INI файлы

Некоторые модификации методов ReadSection и ReadSections объекта, типа TIniFile

Автор: VID
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Некоторые модификации методов ReadSection и ReadSections объекта, типа TIniFile

Отличие функции 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 TIniFile, который позволяет читать и записывать файлы INI. Два функции, ReadSectionsEx и ReadSectionEx, предлагают дополнительные возможности, не доступные в стандартном TIniFile.

Расшифровка каждой функции:

  1. ReadSectionsEx: Функция чтения всех секций из файла INI и возвращает их как список строк. Она принимает три параметра: имя файла INI, объект TStrings для хранения имен секций, и возвращает количество секций, прочитанных.
  2. ReadSectionEx: Функция чтения конкретной секции из файла INI и возвращает ее как список строк. Она принимает три параметра: имя файла INI, имя секции для чтения, объект TStrings для хранения содержимого секции, и возвращает количество строк в секции.

Основные отличия этих функций от стандартных методов TIniFile следующие:

  • Размер буфера не фиксирован (16 КБ), а равен размеру файла INI.
  • В случае успешного выполнения эти функции возвращают количество строк в списке.

Эти изменения могут быть полезны при работе с большими файлами INI или при необходимости иметь больше контроля над процессом чтения.

Пример использования, предоставленный ниже, демонстрирует, как использовать эти функции для чтения секций из файла INI. Он создает объект TIniFile, заполняет список строк именами секций с помощью ReadSectionsEx, а затем читает содержимое конкретной секции ('Boot') с помощью ReadSectionEx.

Однако в этом коде есть некоторые потенциальные проблемы:

  • Буфер не инициализируется перед использованием. В Delphi рекомендуется инициализировать все переменные перед использованием.
  • Нет обработки ошибок для случая, когда файл INI не существует или не может быть прочитан.
  • Функции GetPrivateProfileSectionNames и GetPrivateProfileString используются неправильно. Они требуют размер буфера как последний параметр, который не предоставляется в этом коде.

Вот обновленная версия функций с учетом этих проблем:

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(PChar(IniFileName), buffer, BufSize) <> 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;

Вот обновленный пример использования:

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.

В этом коде предполагается, что файл INI существует и может быть прочитан. Если это не так, он выйдет без чтения ничего. Более robust версия кода включала бы обработку ошибок для этих случаев.

Некоторые модификации методов ReadSection и ReadSections объекта, типа TIniFile, позволяют решать проблемы нехватки оперативной памяти при чтении содержимого секций INI-файла.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: INI файлы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:42:40/0.0065879821777344/1