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

Why does the read-only test work for a read-write file when using _access?

在使用某些 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;
}

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

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

微软文档在这里。 https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/access-waccess

是的,Linux access 的工作方式相同。

问题在于您如何看待 "read-only"。检查只读访问意味着

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 上完全一文不值。


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