_access和_access_s是Windows专属函数,Linux/macOS缺乏头文件及声明,编译失败;跨平台应按环境分发:Windows用_access,POSIX系统用access(),或统一用open()/fopen()试操作。

_access 和 _access_s 都不是跨平台方案,Windows 专属,Linux/macOS 下直接编译失败。真要跨平台检测文件权限,得换思路。
为什么 _access 和 _access_s 不能跨平台
这两个函数是 Microsoft CRT 提供的 Windows 扩展,头文件 在 GCC/Clang(Linux/macOS)里压根不提供,连声明都没有。用 CMake 或 make 编译时会报错:error: 'access' was not declared in this scope(注意:标准 POSIX access() 是另一个函数,名字像但行为和参数不同)。
-
_access和_access_s的第二个参数用的是0(存在)、2(写)、4(读)这类魔数,而 POSIXaccess()用的是F_OK、W_OK、R_OK -
_access_s是安全版本,带缓冲区检查,但只在 MSVC 中可用;GCC 不识别该符号 - 即使你 #ifdef WIN32 包裹,也解决不了“想写一次代码跑三端”的需求
POSIX access() 是跨平台可行解,但要注意它不检查 Windows ACL
标准 C 库里的 access()(声明在 )在 Linux/macOS/WSL 上工作正常,在 MinGW-w64(非 MSVC)下也可用,但它在 Windows 原生 MSVC 工具链中默认不可用——除非你用 UCRT 或启用 POSIX 兼容层(不推荐)。更现实的做法是:按编译环境选实现。
- Linux/macOS/MinGW:直接调用
access("path", R_OK | W_OK) - MSVC:必须用
_access("path", 2)(写)或_access("path", 4)(读),且需包含 - 注意:
access()检查的是进程有效 UID/GID 的权限,不反映 Windows 的 DACL 细粒度控制(比如某用户有 NTFS 写权限但被 deny 了,access()可能仍返回 0) - 它不检查磁盘空间、文件锁、只读挂载等运行时限制,仅做静态权限位判断
真正健壮的检测方式:open() + close() 试操作
权限检查只是预测,真正可靠的方式是尝试打开文件——这既是 POSIX 推荐做法,也兼容 Windows(用 CreateFile 或 fopen)。C++ 中最直白的是用 std::fstream 或 C 的 fopen(),但要注意错误码语义差异。
- 读检测:
fopen("path", "r") != nullptr—— 成功即表示可读(且文件存在) - 写检测:
fopen("path", "w")会截断内容,危险;改用"r+"或"a"更安全;或者用open("path", O_WRONLY | O_NONBLOCK)(Linux) - C++17 起可用
std::filesystem::status("path").permissions(),但它只返回权限位(如owner_read),不反映实际可否访问(例如被 umask 屏蔽、父目录无 x 权限) - 关键点:所有“检测”都应在真正 IO 前一刻做,否则存在竞态(TOCTOU)——文件可能在检测后、使用前被删/改权限
附:最小可行跨平台检测封装(C++11)
下面这个函数用预处理器分发,不依赖第三方库,覆盖主流场景:
#include <string>
#ifdef _WIN32
#include <io.h>
#else
#include <unistd.h>
#endif
bool can_read_write(const std::string& path) {
#ifdef _WIN32
return (_access(path.c_str(), 4) == 0) && (_access(path.c_str(), 2) == 0);
#else
return (access(path.c_str(), R_OK | W_OK) == 0);
#endif
}
</unistd.h></io.h></string>
注意:它仍只是静态检查。如果路径是目录,_access 在 Windows 下对目录的写权限判断不可靠(目录“可写”实际取决于父目录是否允许创建/删除子项);access() 对目录的 W_OK 检查的是“能否在该目录下创建文件”,不是“能否修改目录自身属性”。这点很容易被忽略。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











