我正在尝试编写一个C程序,用于将内容从源文件复制到目标文件。我想检查错误,看看文件是否存在,如果用户可以读取它,然后试图复制它。
我使用unistd.h中的access()。
这是上下文,我有一个文件夹:
.
├── src.txt
├── test
└── test.c
C是我的程序,用于测试文件是否存在以及是否可以读取。
int main(){
char* path = "src.txt";
fprintf(stderr, "%d\n", access(path, F_OK));
fprintf(stderr, "%d\n", access(path, R_OK));
return 0;
}
在这个例子中,当SRC文件存在并且具有权限664时,结果应该是:
1
1
但实际产出是
0
0
即使使用绝对路径而不是指向src.txt的相对路径,也会得到相同的结果。让我不安的是,如果我试图打开文件,它会工作:
测试c
int main(){
char* path = "src.txt";
fprintf(stderr, "%d\n", access(path, R_OK));
fprintf(stderr, "%d\n", access(path, F_OK));
FILE *f = fopen(path, "r");
if (!f) {
fprintf(stderr, "File couldn't be opened.\n");
} else {
fprintf(stderr, "File successfully opened.\n");
fclose(f);
}
return 0;
}
作为输出:
0
0
File successfully opened.
我肯定我漏掉了什么,但我看不出来是什么。
最佳答案
access(2)
函数在成功时返回0
。如果您没有所请求的权限,或者文件不存在,或者路径查找失败,它就会返回-1
。请参见man page。它还将errno
变量设置为适当的错误代码。因此,您看到的0
的输出是正确的,因为您对所述文件具有读取权限。
另外,大多数系统在出错时调用return-1(例如read(2)
、open(2)
、write(2)
等),并设置errno
变量以反映发生的确切错误。为了在错误期间采取正确的操作,您需要检查errno
变量的值。