Возникла классическая задача: необходимо создать (при отсутствии) каталог с несколькими вложенными подкаталогами.
Стандартные функции для этого мне не известны, поэтому я написал следующую процедуру:
- Код: Выделить всё
procedure MkDirFull(dir: String);
var
s, curr_dir: String;
begin
s := dir + DirectorySeparator;
curr_dir := '';
if UTF8Pos(DirectorySeparator, s) > 0 then
begin
while UTF8Pos(DirectorySeparator, s) > 0 do
begin
curr_dir := UTF8Copy(s, 1, Pos(DirectorySeparator, s) - 1);
if not DirectoryExists(curr_dir) then
if not CreateDir(curr_dir) then
ShowMessage('Не могу создать директорию ' + curr_dir + '. Ошибка ' + IntToStr(GetLastError));
ChDir(curr_dir);
UTF8Delete(s, 1, Pos(DirectorySeparator, s));
end;
end
else
if not CreateDir(s) then
ShowMessage('Не могу создать директорию ' + s + '. Ошибка ' + IntToStr(GetLastError));
end;
Как обычно, всё оказалось не так просто. Заметил два момента:
1) GetLastError - WinAPI функция. Как быть с портированием на Linux? Можно, наверное, использовать MkDir вместо CreateDir, но в случае возникновения проблем хотелось бы иметь что-то вроде кода ошибки.
2) по причине, мне непонятной, когда процедура отработала и вложенные каталоги появились, их невозможно удалить через Проводник до тех пор, пока работает приложение. Судя по всему, где-то не закрывается какой-то процесс. Как быть с этим?