【问题标题】:access(path, flag) returns 0 even if file exists即使文件存在,访问(路径,标志)也返回 0
【发布时间】:2018-09-15 17:57:44
【问题描述】:

我正在尝试编写一个用于将内容从源文件复制到目标文件的 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.

我确定我错过了什么,但我看不到它是什么。

【问题讨论】:

  • 就像您的代码一样,access 在成功执行时返回 0,在错误时返回负值。

标签: c file posix


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在本例中,由于 src.file 存在且权限为 664,所以结果应该是:1 1 ? 不应该是 0 0,从 manual page of access() 开始。 p>

    返回值 成功时(授予所有请求的权限,或模式为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 测试文件是否存在以及在您的情况下是否正确,因此打印0

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 1970-01-01
      • 2021-08-13
      • 2019-08-08
      • 1970-01-01
      • 2019-10-13
      • 2016-05-28
      • 1970-01-01
      • 2018-12-13
      相关资源
      最近更新 更多