Файл Delphi существует

Обновлено: 21.11.2024

Подпрограммы управления файлами Delphi

Delphi поставляется с рядом файловых процедур, определенных в SysUtils Unit, которые помогают вам работать с файлами. В этом примере вы узнаете, как:

  • Чтение и изменение даты и времени файла
  • Доступ к атрибутам файла и их изменение (например, сделать файл доступным только для чтения или скрытым)
  • Извлечь имя файла из пути
  • Извлечь каталог из пути
  • Извлеките и измените расширение файла.
  • Переименовывать и перемещать файлы
  • Определить и изменить текущий активный каталог
  • Удалить файл
  • Проверить допустимый файл или каталог
  • Рекурсивный поиск файлов (или частичных имен файлов) по заданному пути
  • Определение даты и времени создания файла
  • Определение даты и времени доступа к файлу
  • Определение даты и времени обновления файла

Вы также увидите пример рекурсивного кодирования, заполнения StringGrid и использования анимации во время ожидания. С этой темой связана работа с файлами INI, но я не буду здесь ее освещать. Нажмите здесь, чтобы увидеть пример использования INI-файла в приложении Delphi.

Обзор файловых процедур

Я написал небольшое приложение для демонстрации многих файловых процедур, которые можно использовать в Delphi. Некоторые из них очень очевидны и не требуют особых объяснений. Другие немного сложнее, но по-прежнему довольно просты в использовании. Пример, который вы можете загрузить с этого блога, охватывает все из них. Просмотрите код для получения более подробной информации. Ниже приведены некоторые из самых простых подпрограмм:

Извлечение пути (включая обратную косую черту):

Функция возвращает строку, которая будет пустой, если имя файла не включает путь к диску и каталогу. Например: ExtractFilePath(‘Test.txt’) вернет пустую строку, а ExtractFilePath(‘c:\temp\Test.txt’) вернет «c:\temp\».

Извлечение каталога (исключая обратную косую черту):

Функция возвращает строку, которая будет пустой, если имя файла не включает путь к диску и каталогу. Например: ExtractFileDir(‘Test.txt’) вернет пустую строку, а ExtractFileDir(‘c:\temp\Test.txt’) вернет «c:\temp». Результирующая строка представляет собой каталог, который можно передать другим функциям, таким как GetCurrentDir.

Извлечение имени файла:

Эта функция возвращает имя файла, даже если параметр «Имя файла» не включает путь к диску и каталогу. Например: ExtractFileName(‘Test.txt’) и ExtractFileName(‘c:\temp\Test.txt’) вернут «Test.txt».

Извлечение расширения файла:

Эта функция возвращает расширение имени файла. Например: ExtractFileExt(‘Test.txt’) вернет «.txt». Обратите внимание, что символ точки, разделяющий имя и расширение, включен. Если файл не имеет расширения, возвращаемая строка будет пустой. Итак, ExtractFileExt(‘c:\temp\Test’) вернет пустую строку.

Переименование или перемещение файла:

Функция пытается изменить имя файла с «OldFileName» на «NewFileName». Например, код, который переименует файл «Test.txt» в «Hello.txt», — это RenameFile(‘c:\Test.txt’, ‘c:\Hello.txt’). Если операция выполнена успешно, функция возвращает True. В случае неудачи возвращается False.

Если вы укажете новый путь к файлу как часть нового имени, файл также будет перемещен. Например, RenameFile('c:\Test.txt', 'd:\'Hello.txt') переименует файл «Test.txt» в «Hello.txt» и переместит его из «c:\» в « д:\".

В Windows, если новое имя файла представляет существующий файл, операция завершится ошибкой. Но в Linux он перезаписывается без предупреждения.

Изменение расширения файла:

НовоеИмяФайла := ChangeFileExt (ИмяФайла, НовоеРасширение) ;

ПереименоватьФайл (СтароеИмяФайла, НовоеИмяФайла);

Функция «ChangeFileExt» фактически не переименовывает файл с новым расширением. Он просто создает новую строку имени файла, используя новое расширение. Затем вам нужно будет вызвать функцию «RenameFile», чтобы переименовать фактический файл. При указании нового расширения включите предыдущий период. В противном случае, например, ChangeFileExt(‘Mary.bmp’, ‘jpg’) приведет к «Maryjpg» вместо «Mary.jpg».

Определение существования файла или каталога:

FileExists возвращает значение True, если имя файла, указанное в параметре «FileName», существует. В противном случае возвращается False. Точно так же DirectoryExists возвращает значение True, если каталог существует, и значение False, если его нет.

Удаление файла:

Функция DeleteFile удаляет файл, указанный в «FileName». В случае успеха возвращается True.Если это не удается по какой-либо причине (файл не существует, установлен только для чтения, нет разрешений), возвращается False.

Определение текущего каталога:

Важно отметить, что если вы не укажете полный путь как часть имени файла, вы можете получить неожиданные результаты. Например, код RenameFile («C:\Test.txt», «Hello.txt») может доставить вам неприятности. Вы можете ожидать найти файл «Hello.txt» в папке «C:\» после выполнения кода, но это может быть не так. Если, например, текущий каталог в памяти установлен как «D:\MyDocuments\letters», файл «Test.txt» будет переименован в «Hello.txt», а затем перемещен в «D:\MyDocuments\letters. ”

Чтобы определить текущий каталог, используйте функцию GetCurrentDir.

Установка текущего каталога:

Чтобы изменить текущий каталог на другой, используйте функцию SetCurrentDir. Например:

если GetCurrentDir <> ‘C:\Pictures’, то SetCurrentDir(‘C:\Pictures’) ;

Приведенный выше код оценит текущий каталог и убедится, что для него задано значение «C:\Pictures». В случае успеха возвращается True. В противном случае возвращается False.

Поиск штампа даты и времени файла:

Чтобы получить метку времени ОС для файла, используйте функцию FileAge. Затем вы можете преобразовать возвращенное значение (целое число) в объект TDateTime с помощью функции FileDateToDateTime. Если файл не существует, FileAge возвращает -1. (Примечание: в Linux допустимой отметкой времени является -1. Используйте FileExists, чтобы проверить, существует ли файл или нет.)

// FileAge возвращает штамп файла в виде целого числа

// FileDateToDateTime преобразует целочисленное значение
//, возвращенное FileAge, в объект TDateTime.
// Затем мы используем DateTimeToStr для преобразования его в строку

Изменение штампа даты и времени файла:

Следующая функция изменяет отметку даты и времени ОС файла.

Используйте FileOpen, чтобы открыть файл и получить его дескриптор, и fmOpenWrite, чтобы определить режим доступа. Если возвращаемое значение равно 0 или больше, функция выполнена успешно. Возврат -1 указывает на ошибку.

FileSetDate устанавливает временную метку ОС указанного файла в значение, указанное параметром newDateTime. Функция DateTimeToFileDate используется для преобразования значения TDateTime в отметку времени ОС. «X» — это дескриптор файла Windows для изменения.
В случае успешного выполнения функции возвращаемое значение равно нулю. В противном случае возвращаемое значение является кодом ошибки.

FileClose закрывает файл с дескриптором, полученным ранее с помощью FileOpen.

Вызовите указанную выше функцию, передав FileName и NewDateTime:

Поиск файловых атрибутов файла:

Используйте FileGetAttr для получения атрибутов данного файла. Это возвращается как строка битов. Возвращаемое значение -1 указывает на ошибку.

Атрибуты := FileGetAttr(FileName);
// Атрибуты определяются как целочисленная переменная

Примеры:

если атрибуты и faReadOnly > 0, то ShowMessage('Файл доступен только для чтения')
else ShowMessage('Файл не только для чтения');

если атрибуты и faReadOnly = faReadOnly, то ShowMessage('Файл доступен только для чтения')
else ShowMessage('Файл не только для чтения');

если атрибуты и $1 <> 0, то ShowMessage('Файл доступен только для чтения')
else ShowMessage('Файл не только для чтения');

В нашем примере у нас есть:

Если «Атрибуты и faReadOnly = faReadOnly» оцениваются как «True», тогда флажок «chkReadOnly» будет установлен. В противном случае флажок будет снят.

Установка и удаление файловых атрибутов файла:

Используйте FileSetAttr для установки атрибутов данного файла. В случае успеха возвращается 0. В следующих примерах «Атрибуты» — это целочисленная переменная, равная FileGetAttr(FileName).

если FileSetAttr ('c:\Test.txt', Attributes или faReadOnly) = 0, то ShowMessage ('c:\Test.txt установлен в ТОЛЬКО ДЛЯ ЧТЕНИЯ')
else ShowMessage ('ОШИБКА установки атрибутов! ');

если FileSetAttr ('c:\Test.txt', Attributes или $01 или $02) = 0, то ShowMessage ('c:\Test.txt настроен ТОЛЬКО ДЛЯ ЧТЕНИЯ и СКРЫТ')
else ShowMessage (' СБОЙ установки атрибутов!');

Вы также можете использовать FileSetAttr для удаления атрибута. Пример:

если FileSetAttr ('c:\Test.txt', Attributes xor faReadOnly) = 0, то ShowMessage ('c:\Test.txt больше не доступен только для чтения')
else ShowMessage ('Удаление Read- Только атрибут FAILED!');

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

Процедура RecursiveFileSearch в нашем примере рекурсивно ищет указанное имя файла (или часть имени — допускаются подстановочные знаки) в заданной корневой папке, а затем заполняет StringGrid следующей информацией:

  1. Полный путь к соответствующему имени файла
  2. Размер файла
  3. Атрибуты файла
  4. Дата и время создания файла
  5. Дата и время последнего изменения файла
  6. Дата и время последнего обращения к файлу
  7. Время, необходимое для завершения поиска

Код задокументирован, поэтому скачайте проект и следуйте инструкциям. Обратите внимание на следующее:

  • Тип TSearchRec определяет информацию о файле, которую ищет функция FindFirst или FindNext. Если файл найден, поля параметра типа TSearchRec изменяются, чтобы указать найденный файл.
  • FindFirst ищет в указанном каталоге первый файл, который соответствует имени файла и атрибутам. Используйте поля этой записи поиска для извлечения необходимой информации. FindFirst возвращает 0, если файл был успешно обнаружен, в противном случае возвращает код ошибки.
  • FindNext возвращает следующую запись, которая соответствует имени и атрибутам, указанным в предыдущем вызове FindFirst. Возвращаемое значение равно нулю, если функция выполнена успешно. В противном случае возвращаемое значение является кодом ошибки.
  • FindFirst выделяет ресурсы (память), которые должны быть освобождены путем вызова FindClose.
  • Функция FileTimeToDateTime позволяет нам преобразовывать значения ftCreationTime, ftLastWriteTime и ftLastAccessTime для отображения в нашей сетке.

Ускорение поиска и анимация ожидания

В моем примере я заполняю StringGrid результатами поиска файлов. Я также покажу пример того, как использовать TAnimate для отображения общего AVI-файла во время поиска (анимация «пока вы ждете»). Скрытие сетки перед поиском и отображение ее после поиска может значительно ускорить ваш поиск. В моем случае, например, рекурсивный поиск всех DLL-файлов под Windows выполнялся в два раза быстрее, чем StringGrid был скрыт. Подробнее см. ниже.

Когда StringGrid виден во время поиска файла:

Если StringGrid скрыт во время поиска файла:

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

Читайте также: