Перейти к содержимому

System.IOUtils – удобные утилиты Delphi для работы с файлами и директориями

Начиная с версии XE2 в Delphi появился юнит System.IOUtils, включающий удобные утилиты для работы с файлами и директориями. Предлагаю вместе подробно разобраться с тем, что в юните System.IOUtils имеется и попробовать на примерах как это всё работает.

Всего в юните System.IOUtils вы можете обнаружить три структуры TDirectory, TFile и TPath, содержащие только статические методы. Если вы разрабатываете на .NET, то вы заметите сходство этих трёх структур с классами Directory, File и Path из пространства имён System.IO в .NET. На самом деле в справке Delphi, так и написано, что большинство методов схожи с методами аналогичных классов в .NET. Это даже неплохо, ведь классы Directory, File и Path очень удобные, значит и в Delphi теперь всё должно быть удобно. Но давайте проверять.

Содержание[Скрыть]

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

Структура TDirectory используется в Delphi для работы с директориями. Она содержит только статические методы. Давайте рассмотрим их.

Создание и удаление директории

Начнём наше знакомство со структурой TDirectory, пожалуй, с методов для создания и удаления директории. Для этого есть соответствующие методы CreateDirectory и Delete. Функция CreateDirectory принимает во входном параметре полный путь к директории и создаёт все недостающие в указанном пути папки. Например, если вы хотите создать директорию «Test3», путь к которой должен быть «C:Test1Test2Test3», а у вас на компьютере есть только директория «C:Test1», которой нет директории «Test2», то функция CreateDirectory создаст сначала директорию «Test2» в директории «Test1», а затем создаст директорию «Test3» в директории «Test2». Т.е. после вызова этой функции у вас будут все три директории, указанные в пути.

Функция Delete удаляет только последнюю директорию, указанную в пути. Например, если у вас на диске «C:» есть директория «Test1», в ней директория «Test2», и в ней директория «Test3», то чтобы удалить директорию «Test3» в функцию Delete нужно передать полный путь к этой директории, в нашем примере это будет «C:Test1Test2Test3». Также функция Delete умеет рекурсивно удалять вложенные директории и файлы, если второй входной параметр установлен в true.

Вот примеры использования функций CreateDirectory и Delete:

Проверка существования директории

Чтобы проверить, существует ли директория, у структуры TDirectory есть функция Exists. Первый параметр функции – это путь к директории. Второй необязательный параметр FollowLink учитывается только при использовании символической ссылки. Если нужно проверить только существование символической ссылки на директорию, то нужно установить этот параметр в false, а если нужно проверить наличие всего сразу, т.е. и символической ссылки на директорию и самой директории, то нужно установить этот параметр в true. Вот примеры использования:

Чтение и изменение характеристик директории

В структуре TDirectory для чтения и изменения характеристик директории есть следующие методы:

    • GetAttributes – возвращает атрибуты папки, такие как «только чтение», «системная», «скрытая» и т.п.;
    • SetAttributes – устанавливает новый набор атрибутов директории, такие как «только чтение», «системная», «скрытая» и т.п.;
    • GetCreationTime и GetCreationTimeUtc – возвращают дату и время создания директории;
    • SetCreationTime и SetCreationTimeUtc – устанавливают дату и время создания директории;
    • GetLastAccessTime и GetLastAccessTimeUtc – возвращают дату и время последнего обращения к директории;
    • SetLastAccessTime и SetLastAccessTimeUtc – устанавливают дату и время последнего обращения к директории;
    • GetLastWriteTime и GetLastWriteTimeUtc – возвращают дату и время последней записи в директорию.
    • SetLastWriteTime и SetLastWriteTimeUtc – устанавливают дату и время последней записи в директорию.

Функции, возвращающие и устанавливающие время, в конце имени которых есть суффикс «Utc», возвращают время в формате всемирного координированного времени (UTC).

Теперь рассмотрим примеры:

Копирование, перемещение и переименование директории

Для копирования директории у структуры TDirectory есть метод Copy, а для перемещения или переименования – метод Move. Перечисленные выше операции производятся с директорией в целом, включая вложенные директории и файлы.

Если директория, в которую происходит копирование, уже существует, то произойдёт слияние существующей директории и директории, которую вы копируете. При этом совпадающие файлы в директории назначения будут удалены, а вместо них будут скопированы файлы из директории источника.

Вот пример использования методов Copy и Move:

Получение списка файлов и поддиректорий в директории

Чтобы получить список всех файлов и поддиректорий, находящихся внутри какой-либо директории у структуры TDirectory есть методы GetFiles, GetDirectories и GetFileSystemEntries. Метод GetFiles возвращает только файлы, метод GetDirectories – только поддиректории, метод GetFileSystemEntries возвращает и файлы и директории. Каждый из этих методов поддерживает шаблоны поиска и фильтры и может работать рекурсивно.

Кроме того здесь стоит упомянуть и о функции IsEmpty, которая проверяет, пустая директория или нет.

Вот примеры использования методов GetFiles, GetDirectories, GetFileSystemEntries и IsEmpty:

Работа с путями директорий

Путь, который определяет местоположение директории, может сказать о многом. Из него, например, можно получить корневую директорию с помощью функции GetDirectoryRoot. В нём можно найти все родительские директории с помощью рекурсивного вызова функции GetParent. Иногда путь может быть относительным, что вы сможете легко проверить с помощью функции IsRelativePath.

Дополнительно может пригодиться функция GetLogicalDrives, возвращающая список всех логических дисков на компьютере.

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

Получение и изменение текущей директории приложения

Кроме всего вышеперечисленного у структуры TDirectory есть функции для получения и изменения текущей директории приложения: GetCurrentDirectory и SetCurrentDirectory. Вот примеры использования:

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

Структура TFile используется в Delphi для работы с файлами. Она содержит только статические методы. Давайте рассмотрим их.

Создание и удаление файла

Для создания файла у структуры TFile есть несколько методов:

    • Create – создаёт пустой файл и возвращает ассоциированный с ним поток (экземпляр TFileStream), в который сразу можно записывать какие-либо данные.
    • CreateText – создаёт пустой файл и возвращает экземпляр объекта TStreamWriter для записи текста в файл.
    • CreateSymLink – создаёт символическую ссылку (которая, по сути, тоже является файлом) для папки или файла. Обратите внимание, что для создания символической ссылки, ваше приложение должно выполняться с правами администратора.

Для удаления файла есть функция Delete.

Рассмотрим примеры:

Функции удобной записи в файл и чтения из него

У структуры TFile есть очень удобные методы, позволяющие делать запись в файл и чтение из него, всего в одну строчку. Вот эти методы:

    • WriteAllBytes – записывает массив байт в файл. Если указанный файл существует, то он будет перезаписан.
    • WriteAllLines – записывает все строки из массива строк в файл. Если указанный файл существует, то он будет перезаписан. Метод умеет конвертировать записываемый текст в нужную кодировку. Если указана кодировка и она не ANSI, то метод записывает маркер последовательности байтов (BOM).
    • WriteAllText – записывает одну строку в файл. Если указанный файл существует, то он будет перезаписан. Метод умеет конвертировать записываемый текст в нужную кодировку. Также метод умеет записывать маркер последовательности байтов (BOM).
    • AppendAllText – добавляет текст в конец файла. Если файла нет, то он будет создан.
    • ReadAllBytes – считывает файл в новый массив байт.
    • ReadAllLines – считывает все строки из файла в массив строк. Метод умеет считывать текст в заданной кодировке.
    • ReadAllText – считывает весь текст из файла. Метод умеет считывать текст в заданной кодировке.

Вот примеры использования методов WriteAllText, ReadAllText и AppendAllText:

Вот примеры использования методов WriteAllLines, ReadAllLines и AppendAllText:

А вот примеры использования функций WriteAllBytes и ReadAllBytes:

Ещё несколько функций для того, чтобы открыть файл

Теперь рассмотрим ещё на несколько удобных функций для открытия файла. Это функции AppendText, OpenText, Open, OpenRead, OpenWrite.

Функции AppendText и OpenText предназначены для работы с текстовыми файлами в кодировке UTF-8. AppendText открывает файл, или создаёт новый файл, если его не было, для добавления в него текста, а OpenText – для чтения из текстового файла. Функция AppendText для работы с файлом, создаёт и возвращает объект TStreamWriter, который после использования нужно удалить. Функция OpenText для чтения текста создаёт и возвращает объект TStreamReader, который после использования также нужно удалить.

Функции Open, OpenRead, OpenWrite по сути просто создают объект TFileStream и возвращают его. Функция OpenRead открывает файл на чтение, функция OpenWrite — на запись, а функция Open может, как создавать файлы, так и открывать их в различных режимах и с различными привилегиями.

Рассмотрим примеры использования этих функций:

Проверка существования файла

Так же как и у TDirectory у структуры TFile есть функция Exists. Первый параметр функции – это путь к файлу. Второй необязательный параметр FollowLink учитывается только при использовании символической ссылки. Если нужно проверить только существование символической ссылки на файл, то нужно установить этот параметр в false, а если нужно проверить наличие всего сразу, т.е. и символической ссылки на файл и самого файла, то нужно установить этот параметр в true. Вот примеры использования:

Получение цели из символической ссылки

Чуть выше мы упоминали работу с символической ссылкой, а теперь разберёмся, как узнать, на что ссылается символическая ссылка. Для этого у структуры TFile есть две функции с именем GetSymLinkTarget. Вот пример:

Чтение и изменение характеристик файла

В структуре TFile для чтения и изменения характеристик файла есть следующие методы:

    • GetAttributes – возвращает атрибуты файла, такие как «только чтение», «системный», «скрытый» и т.п.;
    • SetAttributes – устанавливает новый набор атрибутов для файла, такие как «только чтение», «системный», «скрытый» и т.п.;
    • GetCreationTime и GetCreationTimeUtc – возвращают дату и время создания файла;
    • SetCreationTime и SetCreationTimeUtc – устанавливают дату и время создания файла;
    • GetLastAccessTime и GetLastAccessTimeUtc – возвращают дату и время последнего обращения к файлу;
    • SetLastAccessTime и SetLastAccessTimeUtc – устанавливают дату и время последнего обращения к файлу;
    • GetLastWriteTime и GetLastWriteTimeUtc – возвращают дату и время последней записи в файл.
    • SetLastWriteTime и SetLastWriteTimeUtc – устанавливают дату и время последней записи в файл.

Функции, возвращающие и устанавливающие время, в конце имени которых есть суффикс «Utc», возвращают время в формате всемирного координированного времени (UTC).

Кроме приведённых здесь функций есть ещё недокументированные статические функции IntegerToFileAttributes и FileAttributesToInteger. Первая конвертирует атрибуты операционной системы для файла или директории в атрибуты, описанные в перечислении TFileAttribute, а вторая — обратно.

Рассмотрим примеры:

Копирование, перемещение и переименование файлов

Для копирования файла у структуры TFile есть метод Copy, а для перемещения или переименования – метод Move.

Метод Copy кидает ошибку, если файл с таким же именем, как файл назначения существует. Однако вы можете установить третий параметр метода Overwrite в true, и тогда операция копирования всё равно выполнится.

Кроме вышеуказанного случая метод Copy кидает ошибку, если файл, который вы хотите копировать, не существует, неверно указан путь или пользователь не имеет достаточных привилегий для копирования файла в указанное место.

Метод Move кидает ошибку, если файл назначения существует.

Вот пример использования методов Copy и Move:

Шифрование и расшифровывание файлов

Шифрование и расшифровывание файла можно сделать с помощью, соответственно, методов Encrypt и Decrypt. После шифрования вы сможете работать с файлом как и раньше. Всю работу по чтению из зашифрованного файла, запись в него и т.д. берёт на себя операционная система. Вот пример использования функций.

Замена содержимого файла

У структуры TFile есть метод Replace, позволяющий заменить содержимое файла на содержимое другого файла. По сути, происходит замена одного файла на другой, но при замене сохранятся все атрибуты файла, содержимого которого мы меняем. Атрибуты копируются следующие: время создания, краткое название файла, идентификатор объекта, дискреционный список контроля доступа (DACL), атрибуты безопасности, шифрование, сжатие и именованные потоки (не в заменяемом файле). Однако вы можете сказать функции Replace, что сохранять атрибуты не нужно, в этом случае вы можете установить четвёртый параметр функции IgnoreMetadataErrors в true. Также для заменяемого файла метод Replace создаёт резервную копию.

Вот примеры использования функции Replace:

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

Структура TPath используется в Delphi для работы с путями. Она содержит только статические методы и свойства. Давайте рассмотрим их.

Специальные символы

При составлении путей к файлам и директориям используются определённые специальные символы, которые могут быть разными в разных операционных системах. Чтобы не ломать голову и не гадать, какие символы для чего нужно использовать, мы можем узнать это у структуры TPath с помощью следующих статических свойств:

    • DirectorySeparatorChar – символ для разделения директорий разного уровня;
    • AltDirectorySeparatorChar – альтернативный символ для разделения директорий разного уровня;
    • ExtensionSeparatorChar – символ для разделения имени от расширения в имени файла;
    • PathSeparator – символ для разделения путей в переменных окружения;
    • VolumeSeparatorChar – символ для отделения буквы диска от остального пути.

Вот пример, с выводом значений всех свойств TPath:

Получение путей к специальным и пользовательским директориям

В каждой современной операционной системе есть директории для хранения документов, видео, музыки и т.п. Кроме того есть разнообразные специальные директории для хранения системных библиотек, временных файлов и т.п. Это сделано для удобства пользователей и разработчиков, а также для поддержания порядка. Для получения путей к таким директориям у структуры TPath есть следующие функции:

    • GetAlarmsPath – путь к директории для хранения пользовательских звуков для будильника. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS. В Windows и OS X эта функция вернёт то же, что и функция GetMusicPath.
    • GetCachePath – путь к директории, в которой ваше приложение может сохранять файлы кеша.
    • GetCameraPath – путь к пользовательской директории, в которую сохраняются фотографии, сделанные с помощью камеры устройства. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS. В Windows и OS X эта функция вернёт то же, что и функция GetPicturesPath.
    • GetDocumentsPath – путь к директории для хранения документов пользователя.
    • GetDownloadsPath – путь к директории для хранения скачанных пользователем файлов. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS.
    • GetHomePath – возвращает либо домашний путь пользователя (в Linux — /home/<username>), либо путь к временной папке приложения (В Windows Vista и позже — C:Users<username>AppDataRoaming), либо путь к хранилищу (в Android — /data/data/<application ID>/files).
    • GetLibraryPath – путь к директории для хранения данных вашего приложения. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку. Например, для Windows — C:Program Files<application folder>, для Android — /data/app-lib/<application ID>.
    • GetMoviesPath – путь к директории для хранения видео пользователя. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS.
    • GetMusicPath – путь к директории для хранения музыки пользователя. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS.
    • GetPublicPath – путь к директории, где можно сохранять данные приложения, доступные другим приложениям. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS. Например, Windows Vista и позже — C:ProgramData, OS X — /Users/<username>/Public.
    • GetPicturesPath – путь к директории для хранения фотографий и картинок пользователя. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS.
    • GetRingtonesPath – путь к директории для хранения пользовательских звуков для звонка. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS. В Windows и OS X эта функция вернёт то же, что и функция GetMusicPath.
    • GetSharedAlarmsPath – путь к директории для хранения общих звуков для будильника. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS. В Windows и OS X эта функция вернёт то же, что и функция GetSharedMusicPath.
    • GetSharedCameraPath – путь к общей директории, в которую сохраняются фотографии, сделанные с помощью камеры устройства. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS. В Windows и OS X эта функция вернёт то же, что и функция GetSharedPicturesPath.
    • GetSharedDocumentsPath – путь к общей директории для хранения документов пользователя. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS.
    • GetSharedDownloadsPath – путь к общей директории для хранения скачанных файлов. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS.
    • GetSharedMoviesPath – путь к общей директории для хранения видео. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS.
    • GetSharedMusicPath – путь к общей папки для хранения музыки. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS.
    • GetSharedPicturesPath – путь к общей директории для хранения фотографий и картинок. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS.
    • GetSharedRingtonesPath – путь к общей папке для хранения звуков для звонка. Если операционная система не поддерживает такую директорию, то эта функция вернёт пустую строку, например, iOS. В Windows и OS X эта функция вернёт то же, что и функция GetSharedMusicPath.
    • GetTempPath – путь к папке для хранения временных файлов. Файлы, сохранённые здесь, могут быть удалены после перезагрузки системы или между сессиями приложения.

Вот пример использования функций:

Работа с путями

У структуры TPath есть много методов для работы с путями, например, для соединения путей или для разбивки:

    • ChangeExtension – изменяет расширение файла в указанном пути. Функция не меняет имя реального файла, она только возвращает новую получившуюся строку.
    • Combine – соединяет два пути в один. Например, если в первом параметре указан абсолютный путь к директории (например, C:Test1), а во втором – имя файла (например, test.txt), то в результате функция вернёт абсолютный путь к файлу (получим C:Test1test.txt). Если во втором параметре указан абсолютный путь, то функция просто вернёт его, игнорируя первый параметр.
    • GetDirectoryName – извлекает путь к директории из пути к файлу. Например, для пути «C:MyAppTemptemp.txt» функция вернёт «C:MyAppTemp». Функция вернёт пустую строку, если в пути к файлу нет части с диском и директорией, например, если вы передадите в функцию строку «test.txt».
    • GetExtendedPrefix – возвращает расширенный тип префикса для указанного пути, если он есть. Возможные варианты \? или \?UNC.
    • GetExtension – извлекает расширение файла из пути. Результат содержит точку в начале строки. Если у имени файла нет расширения, то функция вернёт пустую строку.
    • GetFileName – извлекает имя файла с расширением из пути к файлу. Например, для пути «C:Test1test.txt» функция вернёт «test.txt».
    • GetFileNameWithoutExtension – извлекает имя файла без расширения из пути к файлу. Например, для пути «C:Test1test.txt» функция вернёт «test».
    • GetFullPath – возвращает абсолютный путь для указанного относительного пути. При создании абсолютного пути функция использует текущую директорию. Например, если текущая директория «C:MyApp», то для пути «Temptest.txt», функция вернёт «C:MyAppTemptest.txt». Если вы передали в функцию абсолютный путь, то функция вернёт его без изменений.
    • GetPathRoot – возвращает корень для указанного пути. Например, для пути «C:MyAppTemp», функция вернёт «C:».
    • HasExtension – функция проверяет, есть ли у указанного имени файла расширение.
    • HasValidFileNameChars – функция проверяет, содержит ли имя файла или шаблон имени файла только разрешённые символы.
    • HasValidPathChars – функция проверяет, содержит ли путь только разрешённые символы.
    • IsDriveRooted – функция проверяет, является ли путь абсолютным и содержит ли букву логического диска.
    • IsExtendedPrefixed – функция проверяет, содержит ли путь расширенный префикс.
    • IsPathRooted – проверяет, является ли путь абсолютным.
    • IsRelativePath – проверяет, является ли путь относительным.
    • IsUNCPath – проверяет, указан ли путь в UNC (Universal Naming Convention) формате. Путь в формате UNC начинается с двух слешей, например, «\computerfolder».
    • IsUNCRooted – проверяет, указан ли корень в пути в формате UNC.
    • MatchesPattern – проверяет соответствие имени файла шаблону.

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

Функции для создания временных файлов

Часто в программе нужно создавать временные файлы, для которых нужно придумывать уникальные имена. Чтобы не придумывать свой собственный алгоритм для формирования уникального имени файла вы можете использовать следующие функции структуры TPath: GetTempFileName, GetGUIDFileName или GetRandomFileName. Первая функция создаёт пустой временный файл в папке операционной системы для хранения временных файлов, (см. функцию TPath.GetTempPath) и возвращает абсолютное имя созданного файла. Остальные две функции только генерируют имя файла и не гарантируют его уникальность.

Вот примеры использования функций:

Проверка наличия диска

В функции TPath есть функция DriveExists позволяющая определить, есть на компьютере диск, указанный в пути. Вот пример её использования:

Функции проверки символов для использования в пути и имени файла

Кроме всего вышеперечисленного у структуры TPath есть функции IsValidPathChar и IsValidFileNameChar для проверки символов, подходят ли они для использования в пути и в имени файла и функции GetInvalidFileNameChars и GetInvalidPathChars, которые возвращают символы, которые не допускается использовать в имени файла и в пути. Имея эти символы, вы самостоятельно сможете создать функции, которые будут проверять имена файлов и пути. Посмотрим, что возвращают эти функции:

Получение атрибутов файлов и директорий

И в завершении вкратце упомяну ещё методы GetAttributes и SetAttributes у структуры TPath. Они умеют читать и устанавливать атрибуты файлов и директорий. Описывать их нет смысла, т.к. они по своим функциям повторяют одноимённые методы структур TFile и TDirectory.

Заключение

Как видите, набор инструментов в юните System.IOUtils очень большой. Поверьте, при работе с файлами он существенно облегчает работу. Надеюсь, что статья понравится не только тем, кто ещё не был знаком с замечательным юнитом System.IOUtils, но и тем, кто уже его использует. Ведь и в том, что, казалось бы, уже хорошо знакомо, часто можно найти что-то новое и неизученное.

Опубликовано вDelphi

Ваш комментарий будет первым

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *