Создание вложенных подкаталогов - кроссплатформенно

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Создание вложенных подкаталогов - кроссплатформенно

Сообщение wwswowsogon » 25.01.2022 19:17:55

Всем доброго времени суток!

Возникла классическая задача: необходимо создать (при отсутствии) каталог с несколькими вложенными подкаталогами.

Стандартные функции для этого мне не известны, поэтому я написал следующую процедуру:

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

Re: Создание вложенных подкаталогов - кроссплатформенно

Сообщение iskander » 25.01.2022 19:48:37

Кажется, для той же самой цели в модуле SysUtils есть функция ForceDirectories(const Dir: RawByteString): Boolean;
и в LazFileUtils - ForceDirectory(DirectoryName: string): boolean;
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Создание вложенных подкаталогов - кроссплатформенно

Сообщение wwswowsogon » 25.01.2022 20:27:02

Точно, функция есть, отрабатывает на ура, таким образом, вопрос кроссплатформенности решён. Спасибо большое ;)

И ещё, при её применении не блокируется созданный каталог. Остаётся вопрос, почему он оказывается заблокирован при обычном, ручном создании. Раньше такого не наблюдал вроде. Возможно, в данном случае я что-то сделал не так.
wwswowsogon
постоялец
 
Сообщения: 152
Зарегистрирован: 23.12.2008 20:41:37


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

Рейтинг@Mail.ru