Файл 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 следующей информацией:
- Полный путь к соответствующему имени файла
- Размер файла
- Атрибуты файла
- Дата и время создания файла
- Дата и время последнего изменения файла
- Дата и время последнего обращения к файлу
- Время, необходимое для завершения поиска
Код задокументирован, поэтому скачайте проект и следуйте инструкциям. Обратите внимание на следующее:
- Тип TSearchRec определяет информацию о файле, которую ищет функция FindFirst или FindNext. Если файл найден, поля параметра типа TSearchRec изменяются, чтобы указать найденный файл.
- FindFirst ищет в указанном каталоге первый файл, который соответствует имени файла и атрибутам. Используйте поля этой записи поиска для извлечения необходимой информации. FindFirst возвращает 0, если файл был успешно обнаружен, в противном случае возвращает код ошибки.
- FindNext возвращает следующую запись, которая соответствует имени и атрибутам, указанным в предыдущем вызове FindFirst. Возвращаемое значение равно нулю, если функция выполнена успешно. В противном случае возвращаемое значение является кодом ошибки.
- FindFirst выделяет ресурсы (память), которые должны быть освобождены путем вызова FindClose.
- Функция FileTimeToDateTime позволяет нам преобразовывать значения ftCreationTime, ftLastWriteTime и ftLastAccessTime для отображения в нашей сетке.
Ускорение поиска и анимация ожидания
В моем примере я заполняю StringGrid результатами поиска файлов. Я также покажу пример того, как использовать TAnimate для отображения общего AVI-файла во время поиска (анимация «пока вы ждете»). Скрытие сетки перед поиском и отображение ее после поиска может значительно ускорить ваш поиск. В моем случае, например, рекурсивный поиск всех DLL-файлов под Windows выполнялся в два раза быстрее, чем StringGrid был скрыт. Подробнее см. ниже.
Когда StringGrid виден во время поиска файла:
Если StringGrid скрыт во время поиска файла:
Выше был обзор управления файлами с помощью Delphi. На наших занятиях мы подробно рассказываем об этом, а также проводим дополнительное обучение, например, потоковую передачу файлов, разбиение файлов и их реструктуризацию, а также работу с файлами разных типов.
Читайте также: