#c #linux #file #path
#c #linux #файл #путь
Вопрос:
У меня есть файл заголовка, в котором у меня есть функция load_files(), которая должна скопировать определенный файл из каталога проекта в некоторый путь на компьютере пользователя. Проблема в том, что я не могу найти файл в каталоге моего проекта, я даже не могу найти каталог проекта. Вот мой код.
void load_database_files(const char * prog_dir) {
char cmd[100];
const char * proj_path = getenv("PWD");
sprintf(cmd, "cp -r %s%s %s", proj_path, "/src/database/warehouse.db", prog_dir);
system(cmd);
exit(1);
}
Я ожидал бы, что PWD укажет на каталог проекта, откуда я мог бы найти файл, но вместо этого он возвращает путь к $HOME . Как я могу обойти это? Я использую среду разработки gnome-builder IDE. Если мне нужно предоставить какую-либо другую соответствующую информацию, пожалуйста, дайте мне знать.
Комментарии:
1. У меня есть файл заголовка load_files() ,
load_files()
который, глядя на используемый стиль, называется функцией вC
orC
и на многих языках программирования2. на более легкой ноте, лучше распечатать
cmd
, прежде чем использовать insystem(cmd);
, чтобы быть уверенным, что мы правильно вызываем.3. Ах, извините, я это исправил). Да, я, вероятно, должен сделать это для правильной отладки.
4. Вы также должны использовать
snprintf()
(и проверять случаи, когда конечная строка будет слишком длинной для храненияcmd
) вместоsprintf()
.5. @Shawn Да, я планировал изменить это позже. Есть идеи, как я могу обойти проблему PWD?
Ответ №1:
Прочитайте документацию оболочки. PWD
это переменная среды, в которой оболочка хранит путь к своему текущему каталогу. Итак, если вы находитесь дома (допустим, это так /home/user1
) и chdir $HOME/projects/project_a
, оболочка сохранит /home/user1/projects/project_a
в переменной PWD
. Оболочка всегда обновляет эту переменную, когда вы выполняете внутреннюю команду оболочки cd
, поэтому у вас есть две альтернативы:
- Используйте другое имя переменной для каталога вашего проекта. Допустим, у вашего проекта есть имя
babilony
, и он находится в$HOME/projects
. Хорошим именем было бы использовать переменную среды, напримерBABILONY_HOME
, и инициализировать ее в вашей.profile
строке, например
export BABILONY_HOME="$HOME/projects/babilony"
а затем используйте следующую защиту:
void load_database_files(const char * prog_dir) {
char cmd[100];
const char * proj_path = getenv("BABILONY_HOME"); /* this will point to your project's base directory */
sprintf(cmd, "cp -r %s%s %s", proj_path, "/src/database/warehouse.db", prog_dir);
/* this would expand to 'cp -r /home/user1/projects/babilony/src/database/warehouse.db <prog_dir>' */
system(cmd);
exit(1);
}
но не используйте PWD
переменную, поскольку она меняется каждый раз, когда вы перемещаетесь по файловой системе.