Если ваша программа использует какие-либо файлы данных, настроек и т.п., всегда есть вероятность, что при очередном запуске нужного файла на диске не окажется – то ли пользователь стер по ошибке, то ли вирус потрудился. Если такую ситуацию не предусмотреть, программа "свалится" с выдачей противного сообщения " Access Violation", а автора программы и его маму будут поминать нехорошими словами.
Крайне желательно перед открытием файла проверять, существует ли он на диске. Делается это очень просто:
для файла:
FileExists(имя_файла)
для директории:
DirectoryExists(имя_директории);
Проверка может выглядеть, например, так:
IF NOT(FileExists
(ExtractFilePath(Application.ExeName)+'data.dat') THEN
BEGIN
MessageDlg('Пропал файл data.dat!',mtError,[mbOK],0);
Close
END;
Обратите внимание на конструкцию ExtractFilePath(Application.ExeName). В свойстве Exename глобального объекта Application всегда хранится имя exe-файла нашей программы с полным путем к нему. Функция ExtractFilePath извлекает только путь к exe-файлу. Таким образом, всегда можно узнать, из какой директории запущена программа, и где искать необходимые для ее работы файлы.
У файла есть много параметров – размер, дата и время создания, атрибуты. Их можно "выковыривать" по одному при помощи кучи функций типа GetFileSize, GetAttr и т.д., которые остались в Delphi как тяжелое наследство старого Паскаля. Но есть способ лучше! В языке предусмотрен специальный тип данных TSearchRec для хранения всех сведений о файле в одной переменной:
TSearchRec = record
Time: Integer; // дата и время создания
Size: Integer; // размер в байтах
Attr: Integer; // атрибуты файла
Name: TFileName; // имя файла с расширением
end;
Все поля записи заполняются при помощи процедуры
FindFirst(имя_файла, атрибут, переменная_типа_TSearchRec)
Параметр атрибут указывает, с файл какими атрибутами нужно искать. Его возможные значения:
faReadOnly - только для чтения;
faHidden - скрытый файл;
faSysFile - системный файл;
faVolumeID - метка диска;
faDirectory - директория;
faArchive - обычный файл;
faAnyFile - любой файл.
Например:
VAR s:TSearchRec;
…
with OpenDialog1 do
if Execute THEN
BEGIN
FindFirst(filename,faAnyFile,s);
Label1.Caption:='Размер файла '+IntToStr(s.Size)+'Кб'
END;
Для работы с датой и временем создания файла значение в поле Time надо преобразовать при помощи функции с длинным названием FileDateToDateTime:
Label1.Caption:=DateTimeToStr(FileDateToDateTime(s.Time))