在使用某些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实现的工作原理。我可以找到的关于access函数的posix文档不会以相同的方式描述修饰符,因为unix / posix文档使用诸如F_OK,R_OK之类的常量。
作为后续:我所看到的行为是否与此处描述的在Linux机器上的工作方式一致? https://linux.die.net/man/2/access
Microsoft文档在这里。 https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/access-waccess
答案 0 :(得分:4)
是的,Linux access
将以相同的方式工作。
问题在于您如何考虑“只读”。检查只读访问方式
仅检查我是否可以读取文件
不是
检查我是否只能读取文件
它不是在寻找只读权限,而是在预测以只读模式打开文件是否会成功。
请注意,它实际上也没有正确执行此操作;文档说
它不检查文件系统安全设置
这使得_access()
在Windows上一文不值。
此外,您似乎认为创建文件时"w+"
的{{1}}参数对以后的fopen
调用有一定的影响。它不是。 _access()
正在测试文件名以打开文件时可以使用的模式,而不是测试打开句柄的打开方式(Linux等效文件描述符)。新建文件的权限受其所在目录的权限以及您的umask(而不是初始模式)的影响。