gpt4 book ai didi

c++ - 为什么使用 _access 时只读测试对读写文件有效?

转载 作者:行者123 更新时间:2023-11-30 18:27:55 25 4
gpt4 key购买 nike

在使用一些 Microsoft 文件 I/O 函数的 CPP 应用程序中,我遇到了 _access 函数的一些用法,它看起来类似于 posix API。它似乎不是一个标准的 C 函数。为了确保我理解它是如何工作的,我编写了以下单元测试函数。

TEST_F(TestFileIOApis, FileReadWriteTest)
{
const char* fileName = "newfile.txt";
FILE *fp = fopen(fileName, "w+");

// It's rather strange to me that the read-only and write-only tests work this way
// for a read-write efile.
auto result = _access(fileName, 4);
EXPECT_EQ(result, 0);
EXPECT_EQ(errno, EINVAL);

result = _access(fileName, 2);
EXPECT_EQ(result, 0);
EXPECT_EQ(errno, EINVAL);

result = _access(fileName, 0);
EXPECT_EQ(result, 0);
EXPECT_EQ(errno, EINVAL);

result = _access(fileName, 6);
EXPECT_EQ(result, 0);
EXPECT_EQ(errno, EINVAL);

fclose(fp);
fp = 0;
}

也许文档措辞不清楚,但对我来说只读意味着只读,不可读。由于我将文件创建为读/写文件,因此我预计只读和只写测试会失败。这显然不是 Microsoft 实现的工作方式。我能找到的有关访问函数的 posix 文档并没有以相同的方式描述修饰符,因为 unix/posix 文档使用 F_OK、R_OK 等常量。

作为后续:我看到的行为是否与此处描述的在 Linux 计算机上的工作方式一致? https://linux.die.net/man/2/access

Microsoft 文档位于此处。 https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/access-waccess

最佳答案

是的,Linux access 将以同样的方式工作。

问题在于您如何考虑“只读”。检查只读访问方式

Only check if I can read the file

不是

Check if I can only read the file

它不是在寻找只读权限,而是在预测以只读模式打开文件是否会成功。

请注意,它实际上也没有做到这一点;文档说的是

it does not check the filesystem security settings

这使得 _access() 在 Windows 上完全毫无值(value)。

<小时/>

此外,您似乎认为创建文件时 fopen"w+" 参数对后面的 _access() 有一些影响> 来电。它不是。 access() 正在测试文件名以了解打开它时可以使用的模式,而不是测试打开句柄(Linux 等效项:文件描述符)以了解打开它的模式。新创建的文件的权限受其所在目录的权限和 umask 的影响,而不是初始模式。

关于c++ - 为什么使用 _access 时只读测试对读写文件有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51565463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com