2013-04-29 6 views
4

Я хотел бы знать, можно ли как-то запустить system("pwd") на текущий DIR. Так, например, давайте создадим эту структуру папок.'pwd', чтобы получить путь к текущему файлу

example 
>test 
    >>file 
>test2 
    >>file3 
    >>file4 

И с opendir() и readdir() я доберусь до file3, и я хочу использовать system("pwd"), чтобы получить путь: ..../example/test2/file3. Это как-то возможно, или pwd все время возвратит путь к main.c?

+0

'pwd' будет возвращать« настоящий рабочий каталог »исполняемого файла, если вы явно не измените каталоги. – 2013-04-29 18:26:24

+0

@ 0A0D Я думаю, что это на самом деле означает 'печатный рабочий каталог' – Nelson

+0

думал так ..: -/ – 2013-04-29 18:28:57

ответ

10

Простое открытие и чтение каталогов не изменяет текущий рабочий каталог. Однако изменение каталога в вашей программе будет.

для справки,

#include <unistd.h> 
#include <stdio.h> 

int main() { 
    char cwd[1024]; 
    chdir("/path/to/change/directory/to"); 
    getcwd(cwd, sizeof(cwd)); 
    printf("Current working dir: %s\n", cwd); 
} 
0

Когда вы используете системный вызов (...) в Windows и Linux, он просто выполняет одну команду. Можно сделать то же самое с файлом с командами (вы можете создать его с помощью кода C), но мой оппонент - это то, что вы должны использовать nftw() для получения директорий и после этого использовать opendir()/readdir().

3

Вы можете использовать chdir(2), чтобы изменить dir из C, тогда system("pwd"); предоставит вам то, что когда-либо было каталогом chdir 'ed.

C-equivivalent of pwd -команда getcwd(3).

1

Для систем POSIX я нашел три решения:

Получить значение из переменных окружения "PWD"

#include <stdio.h> 
#include <stdlib.h> 

#ifdef __unix__ 
    #define IS_POSIX 1 
#else 
    #define IS_POSIX 0 
#endif 


int main (int argv, char **argc) 
{ 
    if (IS_POSIX == 1) { 
     puts("Path info by use environment variable PWD:"); 
     printf("\tWorkdir: %s\n", getenv("PWD")); 
     printf("\tFilepath: %s/%s\n", getenv("PWD"), __FILE__); 
    } 
    return 0; 
} 

Результат:

Path info by use environment variable PWD: 
    Workdir: /media/setivolkylany/WorkDisk/Programming/Projects/c-utils 
    Filepath: /media/setivolkylany/WorkDisk/Programming/Projects/c-utils/main.c 

Использование getcwd()

#include <stdio.h> 
#include <stdlib.h> 

#ifdef __unix__ 
    #define IS_POSIX 1 
    #include <unistd.h> 
#else 
    #define IS_POSIX 0 
#endif 


int main (int argv, char **argc) 
{ 
    if (IS_POSIX == 1) { 
     char cwd[1024]; 
     getcwd(cwd, sizeof(cwd)); 
     puts("Path info by use getcwd():"); 
     printf("\tWorkdir: %s\n", cwd); 
     printf("\tFilepath: %s/%s\n", cwd, __FILE__); 
    } 
    return 0; 
} 

Результат

Path info by use getcwd(): 
    Workdir: /media/setivolkylany/WorkDisk/Programming/Projects/c-utils 
    Filepath: /media/setivolkylany/WorkDisk/Programming/Projects/c-utils/main.c 

Выполнить системную команду "PWD" и читать выход

#ifdef __unix__ 
    #define IS_POSIX 1 
    #define _BSD_SOURCE 
#else 
    #define IS_POSIX 0 
#endif 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


int main (int argv, char **argc) 
{ 
    if (IS_POSIX == 1) { 
     char buffer[500]; 
     FILE *output; 

     // read output of a command 
     output = popen("/bin/pwd", "r"); 
     char *pwd = fgets(buffer, sizeof(buffer), output); 

     // strip '\n' on ending of a line 
     pwd = strtok(pwd, "\n"); 

     puts("Path info by execute shell command 'pwd':"); 
     printf("\tWorkdir: %s\n", pwd); 
     printf("\tFilepath: %s/%s\n", pwd, __FILE__); 
    } 
    return 0; 
} 

Результат:

Path info by execute shell command 'pwd': 
    Workdir: /media/setivolkylany/WorkDisk/Programming/Projects/c-utils 
    Filepath: /media/setivolkylany/WorkDisk/Programming/Projects/c-utils/main.c 
Смежные вопросы