【发布时间】:2024-05-09 03:30:02
【问题描述】:
在一个 C 项目中,我试图在特定目录中创建一个目录。
// Find the user's home directory.
// Code from https://*.com/a/2910392/14602523
struct passwd * pw = getpwuid(getuid());
char * home = pw->pw_dir;
// Test if the ".junk" directory exists in the home directory.
// If not, create it.
if (opendir(strcat(home, "/.junk/")) == NULL) {
printf(" - no junk directory\n");
if (mkdir(strcat(home, "/.junk/"), 0777) < 0) {
fprintf(stderr, "Error: Cannot create junk directory.\n");
perror(" - errno");
exit(1);
}
}
opendir() 正常工作:如果~/ 中存在名为.junk/ 的目录,那么我不会收到任何打印消息,如果该目录不存在,那么我会得到一些输出。但是mkdir() 真的很笨拙并引起了很多问题。如果~/.junk/ 不存在,那么我会得到这个输出:
- no junk directory
Error: Cannot create junk directory.
- errno: No such file or directory
但如果我尝试在当前目录下创建目录,例如mkdir("./.junk/", 0777),则目录创建正确。这是怎么回事?为什么它在 ~/ 中的行为不同,我怎样才能让它工作?
【问题讨论】:
-
您的第一个
strcat使用".junk",但mkdir使用“/.junk/”``。你的错误都没有说Cannot empty junk directory。所以你的输出与你的代码不匹配。 -
@DavidCullen 不,我能够使用
getpwuid()正确找到该文件夹,并且该部分适用于opendir()。但由于某种原因,它不适用于mkdir()。 -
@root 哎呀,这些都是我的错。我正在尝试不同的格式,看看是否有区别,但我忘了复制最新的格式。此外,“空”错误来自代码的不同部分,所以这并不重要。编辑问题以解决这些问题。但我还是不明白为什么
opendir()可以访问该文件夹而mkdir()不能。 -
这与您的问题无关,但不要使用
pw->pw_dir获取当前主目录。pw->pw_dir应该是登录时的初始主目录。用户可能希望在运行程序时更改当前目录,因此您应该使用getenv("HOME")而不是pw->pw_dir。详情请见man getpwuid。 -
@HAL9000 很高兴知道,我改变了它。谢谢!