7

我想知道是否可以system("pwd")在当前 DIR 上运行。例如,让我们有这个文件夹结构:

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

和我会得到opendir(),我想用得到的路径。这是否可能,或者会一直返回路径?readdir()file3system("pwd")..../example/test2/file3pwdmain.c

4

5 回答 5

18

简单地打开和读取目​​录不会改变当前的工作目录。但是,更改程序中的目录会。

以供参考,

#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);
}
于 2013-04-29T18:31:13.800 回答
5

对于 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
于 2016-12-28T11:38:00.503 回答
3

您可以使用chdir(2)从 C 更改 dir,然后system("pwd");将给您任何您chdir编辑的目录。

- 命令的 C 等效项pwdgetcwd(3)

于 2013-04-29T18:31:07.833 回答
0

当您在 Windows 和 Linux 上使用 system(...) 调用时,它只执行一个命令。可以使用带有命令的文件来执行相同的操作(您可以使用 C 代码创建它),但我的意见是,您应该使用 nftw() 来获取目录,然后使用 opendir()/readdir()。

于 2013-04-29T18:30:40.513 回答
0

如何不对路径长度进行硬编码pathconf

我相信这是正确的方法:

#define _XOPEN_SOURCE 700
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
    long n;
    char *buf;

    n = pathconf(".", _PC_PATH_MAX);
    assert(n != -1);
    buf = malloc(n * sizeof(*buf));
    assert(buf);
    if (getcwd(buf, n) == NULL) {
        perror("getcwd");
        exit(EXIT_FAILURE);
    } else {
        printf("%s\n", buf);
    }
    free(buf);
    return EXIT_SUCCESS;
}

GitHub 上游.

编译并运行:

gcc -Wall -Wextra -std=c11 -pedantic-errors  -o getcwd.out getcwd.c
./getcwd.out

POSIX 将_PC_PATH_MAX其描述为

为变量 {PATH_MAX} 返回的值表示如果指定目录是进程的当前工作目录,则可以给出的最长相对路径名。如果路径名中的子目录跨入限制性更强的文件系统,进程可能并不总是能够生成这么长的名称并使用它。

在 Ubuntu 18.10 上测试,n == 4096在这个实现中。

于 2019-01-11T23:21:21.180 回答