我想知道是否可以在当前的DIR上运行system("pwd")
。例如,让我们有这个文件夹结构。
example
>test
>>file
>test2
>>file3
>>file4
使用opendir()
和readdir()
我将转到file3
,我想使用system("pwd")
获取路径:..../example/test2/file3
。这是否可行或pwd
将始终返回main.c
的路径?
答案 0 :(得分:12)
只需打开和读取目录不会更改当前工作目录。但是,更改程序中的目录。
供参考,
#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);
}
答案 1 :(得分:3)
答案 2 :(得分:3)
对于POSIX系统,我找到了三个解决方案:
从环境变量中获取价值&#34; PWD&#34;
#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
执行系统命令&#34; pwd&#34;并阅读输出
#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
答案 3 :(得分:0)
当您在Windows和Linux上使用系统(...)调用时,它只执行一个命令。可以使用带命令的文件(你可以使用C代码创建它)来做同样的事情,但我的意见是,你应该使用nftw()获取dirrectories,然后使用opendir()/ readdir()。
答案 4 :(得分: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;
}
编译并运行:
gcc -Wall -Wextra -std=c11 -pedantic-errors -o getcwd.out getcwd.c
./getcwd.out
POSIX描述了_PC_PATH_MAX
it as:
为变量{PATH_MAX}返回的值表示如果指定目录是进程的当前工作目录,则可以给出的最长相对路径名。如果路径名中的子目录跨入限制性更强的文件系统,则进程可能无法总是生成一个长名称并使用它。
在此实现中的Ubuntu 18.10 n == 4096
上进行了测试。