Sites of the week

ads ads ads ads

Работа с ini файлами в Delphi

Posted by admin | Delphi, Интерфейс, Файловая система | Среда 23 Январь 2008 05:23

Вообще, ini-файлы – очень удобная вещь. В ini-файл можно записать практически всё, хотя создан он в основном для хранения настроек программы.

Структура ini-файла очень проста: весь файл поделён на секции. В секциях содержатся ключи и эти ключи хранят значения. Вот пример открытого в блокноте ini-файла:
[Form properties]
Width=450
Height=320
Left=10
Top=35
[Application properties]
Dir=C:\Мои документы\Musuc
Date=28.09.02

В этом ини-файле, как мы видим, 2 секции: Form properties и Application properties. В каждой из этих секций есть ключи, содержащие числа, строковые выражения, дату. Запись в файл осуществляется путём указания секции ини-файла, названия ключа и указания самого значения. Ниже я опишу способы использования ини-файла на Borland Delphi.

Для работы с ини-файлами в Delphi существует модуль IniFiles. В нём описан нужный нам класс TIniFile.

1. Включите Delphi и создайте новый проект.

2. Допишите в Uses новый модуль IniFiles.

3. Создайте глобальную переменную класса TIniFile.
var
Form1: TForm1;
IniFile: TIniFile;

4. При создании формы надо инициализировать переменную IniFile:
procedure TForm1.FormCreate(Sender: TObject);
begin
IniFile:=TIniFile.Create('C:\Program files\MyApplication\MyIni.ini');
end;

Инициализация проходит с участием дополнительного параметра типа string. Это имя файла. Если имя введено не полностью, а, например, так: 'MyIni.ini', то файл создастся при записи в папке Windows. Я же рекомендую создавать файл в папке с программой (её можно узнать так: ExtractFilePath(Application.ExeName)).

5. Как осуществить запись в файл? Для записи в ини-файл есть несколько процедур у класса TIniFile - смотря что надо записать.

Процедура записи строки:
WriteString(const Section, Ident, Value: string);

Процедура записи цифры:
WriteInteger(const Section, Ident: string; Value: Longint);

Процедура записи булевого выражения:
WriteBool(const Section, Ident: string; Value: Boolean);

Запись даты:
WriteDate(const Section, Name: string; Value: TDateTime);

Запись время:
WriteTime(const Section, Name: string; Value: TDateTime);

Запись даты и время вместе:
WriteDateTime(const Section, Name: string; Value: TDateTime);

Запись не целого численного значения:
WriteFloat(const Section, Name: string; Value: Double);

Запись потока:
WriteBinaryStream(const Section, Name: string;Value: TStream);

Во всех этих функциях обязательно указывать секцию (Section), имя ключа (Name) и записываемое значение.

Для наглядности вы можете поместить на форму кнопку и по её нажатию можете прописать следующее:
procedure TForm1.Button2Click(Sender: TObject);
begin
IniFile.WriteString('Form info','Form caption',Caption);
IniFile.WriteInteger('Form info','Left',Left);
IniFile.WriteInteger('Form info','Top',Top);
IniFile.WriteInteger('Form info','Width',Width);
IniFile.WriteInteger('Form info','Height',Height);
IniFile.WriteTime('Other','Write time',Time);
end;

По выполнению этого кода программа создаст (если ещё не создан) файл в указанном при процедуре Create месте и запишет в него примерно следующее:
[Form info]
Form caption=Form1
Left=192
Top=107
Width=544
Height=375
[Other]
Write time=23:13:55

6. Процедура чтения из ини-файла осуществляется похожим способом. Для чтения существуют функции:
ReadString(const Section, Ident, Default: string): string;
ReadInteger(const Section, Ident: string; Default: Longint): Longint;
ReadBool(const Section, Ident: string; Default: Boolean): Boolean;
ReadBinaryStream(const Section, Name: string; Value: TStream): Integer;
ReadDate(const Section, Name: string; Default: TDateTime): TDateTime;
ReadDateTime(const Section, Name: string; Default: TDateTime): TDateTime;
ReadFloat(const Section, Name: string; Default: Double): Double;
ReadTime(const Section, Name: string; Default: TDateTime): TDateTime;

Каждая функция возвращает прочтённое из файла значение. Если по каким-либо причинам прочтение не удалось, то функция возвращает значение, указанное в параметре самой функции как Default.

Например, для прочтения из нашего ини-файла значения Form caption надо написать следующее:
Edit1.Text:=IniFile.ReadString('Form info',
'Form caption','Ошибка при чтении!');

В этом примере тексту помещённого на форму Edit-а присваивается прочтённое из файла значение. В нашем случае тексту Edit-а будет присвоено значение «Form1». Если чтение не удастся, то тексту Edit-а будет присвоено значение «Ошибка при чтении».

Другие процедуры и функции для работы с ини-файлами:

Проверка, существует ли секция:
function SectionExists(const Section: string): Boolean;

Прочтение всей секции:
procedure ReadSection(const Section: string; Strings: TStrings);

Прочтение всего файла (все секции записываются в Strings):
procedure ReadSections(Strings: TStrings);

Прочтение всех значений в заданной секции:
procedure ReadSectionValues(const Section: string; Strings: TStrings);

Удалить заданную секцию со всеми её значениями:
procedure EraseSection(const Section: string);

Удаление определённого ключа (и его значения) в секции:
procedure DeleteKey(const Section, Ident: String);

Проверка, существует ли заданный ключ в указанной секции:
function ValueExists(const Section, Ident: string): Boolean;

Delphi: Рекурсивный поиск файлов

Posted by admin | Delphi, Файловая система | Суббота 25 Август 2007 04:45

Функция для быстрого рекурсивного поиска файлов в поддиректориях.

 
procedure ScanDir(StartDir, Mask: String; List: TStrings);
var
SearchRec: TSearchRec;
begin
if Mask = '' then Mask:= '*.*';
if StartDir[Length(StartDir)] <> '' then StartDir := StartDir + '';
if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then
begin
repeat
Application.ProcessMessages;
if (SearchRec.Attr and faDirectory) <> faDirectory then
List.Add(StartDir + SearchRec.Name)
else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
ScanDir(StartDir + SearchRec.Name + '',Mask,List);
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;

Пример использования:

 
procedure TForm1.Button1Click(Sender: TObject);
var
list: TStrings;
begin
list:= TStringList.Create;
ScanDir('c:', '*.txt', list);
Memo1.Lines:= list;
list.Free;
end;

Файловые операции средствами ShellAPI

Posted by admin | Delphi, Файловая система | Воскресенье 20 Май 2007 20:50

В данной статье мы подробно рассмотрим применение функции SHFileOperation.

далее...

Использование TFileStream

Posted by admin | Delphi, Компоненты, Файловая система | Воскресенье 20 Май 2007 20:45
 
procedure TForm1.Button1Click(Sender: TObject);
var
Buffer: PChar;
Stream: TFileStream;
Size: LongInt;
begin
Stream := TFileStream.Create('Unit1.pas', fmOpenRead);
try
Size := Stream.Size;
GetMem(Buffer, Size);
try
Stream.Read(Buffer[0], Size);
Memo1.Lines.Text := Buffer;
finally
FreeMem(Buffer);
end;
finally
Stream.Free;
end;
end;

Копирование директории вместе с поддиректориями (Delphi)

Posted by admin | Delphi, Файловая система | Воскресенье 20 Май 2007 20:18

Фукция копирует СОДЕРЖИМОЕ директории SourceDir в директорию TargetDir.

Копируются все файлы, подкаталоги, и файлы находящиеся в этих подкаталогах.

Аргумент StopIfNotAllCopied: если значение этого аргумента = True,
то при первой же ошибке копирования файла или папки, работы функции прекратится а функуция вернёт False. В случае если этот аргумент = False, то ошибки копирования учитываться не будут.

Аргумент OverWriteFiles: если True, то существующие файлы будут переписаны.

Зависимости: SysUtils, FileCtrl, Windows

 
function FullDirectoryCopy(SourceDir, TargetDir: string; StopIfNotAllCopied,
OverWriteFiles: Boolean): Boolean;
var
SR: TSearchRec;
I: Integer;
begin
Result := False;
SourceDir := IncludeTrailingBackslash(SourceDir);
TargetDir := IncludeTrailingBackslash(TargetDir);
if not DirectoryExists(SourceDir) then
Exit;
if not ForceDirectories(TargetDir) then
Exit;
 
I := FindFirst(SourceDir + '*', faAnyFile, SR);
try
while I = 0 do
begin
if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
begin
if SR.Attr = faDirectory then
Result := FullDirectoryCopy(SourceDir + SR.Name, TargetDir + SR.NAME,
StopIfNotAllCopied, OverWriteFiles)
else if not (not OverWriteFiles and FileExists(TargetDir + SR.Name))
then
Result := CopyFile(Pchar(SourceDir + SR.Name), Pchar(TargetDir +
SR.Name), False)
else
Result := True;
if not Result and StopIfNotAllCopied then
exit;
end;
I := FindNext(SR);
end;
finally
SysUtils.FindClose(SR);
end;
end;

Пример использования:

Скопирует содержимое директории C:\ (не не саму директорию) в директорию D:\

 
FullDirectoryCopy('C:\', 'D:\');

Удалить директорию с поддиректориями (Delphi)

Posted by admin | Delphi, Файловая система | Воскресенье 20 Май 2007 19:58

В Delphi есть функция RemoveDir которая удаляет пустые директории. Но как быть, если директория содержит файлы и поддиректории?

Для этой цели была создана функция, выполняющая те же действия, что и RemoveDir, но обладающая большими возможностями.

Совместимость: Все версии Delphi

 
Function MyRemoveDir(sDir : String) : Boolean;
var
iIndex    : Integer;
SearchRec : TSearchRec;
sFileName : String;
begin
Result := False;
sDir   := sDir + '\*.*';
iIndex := FindFirst(sDir, faAnyFile, SearchRec);
 
while iIndex = 0 do begin
sFileName := ExtractFileDir(sDir)+'\'+SearchRec.Name;
if SearchRec.Attr = faDirectory then begin
if (SearchRec.Name < > '' )  and
(SearchRec.Name < > '.')  and
(SearchRec.Name < > '..') then
MyRemoveDir(sFileName);
end else begin
if SearchRec.Attr < > faArchive then
FileSetAttr(sFileName, faArchive);
if NOT DeleteFile(sFileName) then
ShowMessage('Could NOT delete ' + sFileName);
end;
iIndex := FindNext(SearchRec);
end;
 
FindClose(SearchRec);
 
RemoveDir(ExtractFileDir(sDir));
Result := True;
end;

Пример:

 
if NOT MyRemoveDir('D:\myDir') then
ShowMessage('Can NOT delete dir');

Заметка:

Cистемные, скрытые и read-only файлы тоже будут удалены.

Страница 1 из 11