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

05.01.2015

Часто, при работе с большим количеством файлов или просто для упорядочения, необходимо распределение файлов по отдельным каталогам и подкаталогам. Для автоматизации процесса, удобно, чтобы программа могла, при необходимости, самостоятельно создавать нужные ей директории для хранения файлов. В 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('Такой папки нет.');

Комментарии

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


4 коммент.

avatar

полиграф

- 05 января 2022, 10:44
Для старый версий дельфи неверно написано, заменяем все "/«на „\“
avatar

Akmaljon

- 11 ноября 2021, 06:50
Ikrom, констант — это величина, которая не изменяет своё значение при выполнение программы!!!
avatar

Антон Сенников

- 18 февраля 2021, 10:05
Ikrom, честно говоря не сталкивался с такой необходимостью. Даже поискал решение в сети, но не нашел. Экспериментировать, тоже не стал — давно нет редакторов для этих языков.
Но думаю, что константы как элемент программирования введены как раз для защиты от изменений их значения. Если у вас есть необходимость переопределить значение, то проще было бы просто назначить переменную, а не константу.

Было бы очень интересно узнать по поводу переназначения констант (в Pascal или другом языке). Если кто-то из посетителей сайта знает точно, напишите пожалуйста.
avatar

Ikrom

- 13 февраля 2021, 12:45
Есть ли способы изменить константы в содержимом программы во время работы программы? При перезапуске программы константа должна получить новое значение. Это возможно? (На языке программирования Паскаль)