LINUX.ORG.RU

[C/C++] Не могу создать директорию относительно рабочего каталога поьлзователя


0

1

Здравствуйте!


Пишу консольную программу, используя стандартные средства C/C++, без лишних зависимостей от boost, Gtk, Qt и т.д.

Требуется создать каталог в рабочем каталоге пользователя. А точнее, код должен уметь создавать каталог ~/.config/myprogram (учитывая, что ~/.config уже есть). И тут начинается веселье.

Вариант 1:

#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>

int main()
{
 // char dirName[]="myprogram";
 char dirName[]="~/.config/myprogram";

 int result=mkdir(dirName, 0755);

 if(result!=0) 
  {
   printf("Cant create directory %s.\n", dirName);
   return 1;
  }

 return 0;
}

- не работает. Если создать просто каталог «myprogram» - он нормально создается с каталоге запуска бинарника. Поэкспериментировав, понял, что походу не работает символ директории пользователя «~», так как к тому же нельзя создать каталог «~/myprogram».

Решил тогда попробовать создать каталог через интерпретатор командной строки, с помощью popen.

Вариант 2:

#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>

int main()
{
 char cmd[250];

 // char dirName[]="foodir";
 char dirName[]="~/.config/foodir";

 sprintf(cmd, "mkdir %s", dirName);
 if(popen(cmd, "r")==NULL)
  {
   printf("Can't run command\n");
   return 1;
  }

 return 0;
}

В этом варианте программа молча срабатывает, но каталог не создается. Ситуация та же самая: можно создать каталог в текущей директории бинарника, но создать каталог относительно рабочего каталога пользователя нельзя.

Что-то я не догоняю, как создать нужный каталог.

Путь вида «~» интерпретируется башем, а не ядром. Так что, читайте маны. Например, man getenv (чтобы получить значение переменной HOME).

Eddy_Em ☆☆☆☆☆
()

Ну ты точно быдло-monkey-кодер. Какая конкретная программа обрабатывает этот пресловутый значок «~»? Изучай, думай.

Потом почитай про переменные окружения.

anonymous
()
Ответ на: комментарий от anonymous

> Потом почитай про переменные окружения.

для тс-а - это же касается и прибитого гвоздями ~/.config. срочно гуглить про XDG_CONFIG_HOME

ananas ★★★★★
()

Про то, что ~ не будет работать, Вам уже написали.
Узнать текущий home-каталог можно через переменные окружения.
Подробности - как обычно, в поисковых системах.

trex6 ★★★★★
()

по теме см. библиотечные функции поддержки POSIX shell (man glob, man wordexp)

системные вызовы не подставляют ~. То есть сначала надо расширить имя файла со всему нужными подстановками, а потом уже использовать полученный результат.

MKuznetsov ★★★★★
()
Ответ на: комментарий от slackwarrior

> Идеологический вектор в^W же!

а его надо таки «в же»

ananas ★★★★★
()

wordexp, но не для этой задачи

const86 ★★★★★
()
Ответ на: комментарий от true_admin

Это ж не виндовс, тут всё могут поменять.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.