即使文件存在,access(path,flag)也会返回0

时间:2018-09-15 17:57:45

标签: c file posix

我正在尝试编写一个C程序,用于将内容从源文件复制到目标文件。我想通过检查文件是否存在以及用户是否可以在尝试复制它之前读取它来检查错误。 我从unistd.h使用access()。

这里是上下文,我有一个文件夹:

.
├── src.txt
├── test
└── test.c

test.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.file存在并且具有权限664,结果应为:

1
1

但是实际输出是

0
0

即使我使用绝对路径而不是导致src.txt的相对路径,我也会得到相同的结果。困扰我的是,如果我尝试打开该文件,它将起作用:

test.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.

我确定我缺少什么,但看不到它是什么。

2 个答案:

答案 0 :(得分:3)

access(2)函数成功返回0。如果您没有请求的权限,或者文件不存在,或者路径查找失败,它将返回-1。请参见man page。还将errno变量设置为适当的错误代码。因此,您看到的0的输出是正确的,因为您确实对该文件具有读取权限。

顺便说一句,大多数系统调用都会在出错时返回-1(例如read(2)open(2)write(2)等),并设置errno变量以反映发生的确切错误。为了在错误期间采取正确的措施,您需要检查errno变量的值。

答案 1 :(得分:3)

在此示例中,由于src.file存在且具有权限664,结果应为:1 1否从{{ 3}}。

  

返回值           成功(授予所有请求的权限,或者模式为0 0并且文件存在)时,返回出现错误(在   模式下至少一位          要求拒绝的权限,或者模式为F_OK,并且文件          不存在,或发生其他错误),返回F_OK,并且          -1设置正确

errno

fprintf(stderr, "%d\n", access(path, R_OK)); 打印为0,以测试文件是否存在并授予读取,写入和执行权限,以及您所说的R_OK存在及其具有权限src.txt,因此它显示0664。还有这个

0

还会打印 fprintf(stderr, "%d\n", access(path, F_OK)); ,因为0测试文件的存在及其真实情况,因此打印F_OK