СтатьиПрограммирование в Delphi

Создание, удаление и проверка на наличие папки в Delphi

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

Средства копирования, переименования и перемещения папки рассматриваются в отдельной статье.

Создание папки

Создать папку в Delphi можно воспользовавшись функцией CreateDir или процедурой MkDir. Так же можно воспользоваться функцией ForceDirectories. Первые две команды корректно выполняют создание одной новой папки. Отличия же в том, как они себя ведут в случае если создать папку невозможно.

Функция CreateDir, в результате своего выполнения возвращает True, если создание папки успешно выполнено и False, если по какой-то причине создание выполнить не удалось. Это удобно для случаев, когда заданная директория может быть уже создана. Здесь можно работать без предварительной проверки на существование такой директории.

if CreateDir('newfolder') then
ShowMessage('Папка успешно создана.')
else
ShowMessage('Ошибка: папка не создана.');

Процедуру MkDir стоит использовать либо в случае, если заведомо известно, что создаваемой директории нет, либо с предварительной проверкой, так как при невозможности создать указанную папку, программа выведет ошибку.

MkDir('newfolder');

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

// полный путь
my_dir1 = 'С:/folder1/folder2/newfolder';

// относительный путь
my_dir2 = 'newfolder';
my_dir3 = 'folder1/newfolder';
my_dir4 = ' ../newfolder';

При использовании любой из указанных переменных, параметром для любой команды создания папки, будет создаваться только папка "newfolder". Создать директорию, используя переменные my_dir1 и my_dir3 можно только, если все остальные папки в директории уже существуют. Например, если папка "'folder1" еще не создана, то и создать "newfolder" так не получится.

Создание нескольких вложенных подпапок

Для создания нескольких вложенных директорий можно использовать функцию ForceDirectories, в которой указывается полный путь. Причем здесь нужно указывать полный путь.

ForceDirectories('С:/folder1/folder2/newfolder');

Такая команда создаст на диске C: все указанные папки.

Чтобы все же работать с фалами относительно папки с программой, можно указать вычисление пути к папке программы с помощью функции ExtractFilePath.

ForceDirectories(ExtractFilePath(Application.ExeName) + '/folder1/folder2/newfolder');

Удаление папки

При удалении папки, важно учитывать есть ли в ней вложения или нет. Если папка пуста, то используется функция RemoveDir, в которой аналогично созданию, указывается путь к удаляемой папке. Функция при своем выполнении так же возвращает True, если удаление успешно и False, если удалить не удалось.

if RemoveDir('myfolder') then
ShowMessage('Папка успешно удалена.')
else
ShowMessage('Ошибка: папка не удалена.');

Если же папка не пуста, то можно использовать пользовательскую функцию, которая будет последовательно удалять все вложенные файлы, а затем и пустые папки. Для среды Delphi 2010, можно воспользоваться следующим методом:

TDirectory.Delete('myfolder', True);

При этом, в разделе описаний должна быть добавлена библиотека IOUtils.

uses IOUtils;

Если же такой возможности нет, стоит использовать следующую функцию, описанную еще в DelphiWorld. В параметре указывается путь к удаляемой папке. При успешном удалении (включая все вложения), функция вернет значение True, если удаление не удалось, вернет False.

// Функция удаления директории с вложениями.
function MyDirectoryDelete(dir: string): Boolean;
var
fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do begin
wFunc := FO_DELETE;
fFlags := FOF_SILENT or FOF_NOCONFIRMATION
pFrom := PChar(dir + #0);
end;
Result := (0 = ShFileOperation(fos));
end;

// Вызов функции удаление в программе.
begin if MyDirectoryDelete('myfolder') then
ShowMessage('Папка успешно удалена.')
else
ShowMessage('Ошибка: папка не удалена.');
end;

В раздел описаний здесь необходимо добавить библиотеку ShellApi.

uses
ShellApi;

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

Для проверки наличия директории используется функция DirectoryExists. В параметре так же указывается полный или относительный путь к папке. Если заданная папка существует, функция вернет True, в обратном случае False.

if DirectoryExists('myfolder') then
ShowMessage('Папка существует.')
else
ShowMessage('Такой папки нет.');


Комментарии

08.03.2016 18:58 Артём [гость]
В пятой дельфе нет функции DirectoryExists :(
Имя:
Текст комментария:
* В комментариях запрещено публиковать рекламные объявления. Сообщения, содержащие ссылки на сторонние ресурсы добавляется в скрытом режиме. Они будут открыты, если не нарушают установленных правил, после проверки.
Защита от спам-роботов (* Обязателельно укажите ответ на простой вопрос ниже.)
Под каким номером в алфавите буква «Б»? (цифра)