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

时间:2018-07-27 20:58:10

标签: c++ c posix msdn

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

1 个答案:

答案 0 :(得分:4)

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

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

  

仅检查我是否可以读取文件

不是

  

检查我是否只能读取文件

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

请注意,它实际上也没有正确执行此操作;文档说

  

它不检查文件系统安全设置

这使得_access()在Windows上一文不值。


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