Возникла классическая задача: необходимо создать (при отсутствии) каталог с несколькими вложенными подкаталогами.
Стандартные функции для этого мне не известны, поэтому я написал следующую процедуру:
- Код: Выделить всё
- 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) по причине, мне непонятной, когда процедура отработала и вложенные каталоги появились, их невозможно удалить через Проводник до тех пор, пока работает приложение. Судя по всему, где-то не закрывается какой-то процесс. Как быть с этим?



