c++ - 尝试打开目录进行读取时,CreateFile 总是返回错误 5(访问被拒绝)
问题描述
我想打开目录句柄,以便我可以观察该目录的文件更改。我在 winapi 上编写了一个简单的类包装器,这就是我在开始监视之前设置目录路径的方式:
bool SetDirectory(const std::string& dirname)
{
HANDLE dirHandleNew = CreateFile(
dirname.c_str(),
// Just normal reading
FILE_GENERIC_READ,
// Share all, do not lock the file
FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (INVALID_HANDLE_VALUE != dirHandleNew)
{
_dirHandle = dirHandleNew;
return true;
}
else
{
_dirHandle = 0;
RLog("Cannot open directory %s for filesystem watching. Win error: %d (%s)", dirname.c_str(), GetLastError(), GetLastErrorAsString().c_str());
return false;
}
}
错误总是:
Cannot open directory D:\tools for filesystem watching. Win error: 5 (Access is denied.)
我在不同的卷上尝试了不同的文件夹,看看这是否是一个实际的权限问题,但看起来不像。D:\tools
在我的电脑中是一个普通文件夹,所有用户都可以访问。但正如我所说,我也尝试了其他文件夹,错误总是一样的。
我也尝试用FILE_LIST_DIRECTORY
(我只需要目录列表)和GENERIC_READ
. 错误还是一样。
可能是CreateFile
参数不对?
解决方案
不要使用 FILE_ATTRIBUTE_NORMAL!
要使用 CreateFile 打开目录,请使用FILE_FLAG_BACKUP_SEMANTICS
而不是FILE_ATTRIBUTE_NORMAL
.
您应该FILE_FLAG_BACKUP_SEMANTICS
在dwFlagsAndAttributes
参数中指定。
现在应该可以了。
推荐阅读
- jenkins - 为什么每次使用此环境变量时都要对其进行评估?
- python - Python 和 Scrapy,并试图将抓取的数据放入 MariaDB/MYSQL 数据库
- postgresql - 未终止的美元引号字符串创建 PostgreSQL 函数
- spring-boot - SpringBoot 休息验证不会因错误的枚举输入而失败
- android - 无法注册广播接收器
- matplotlib - seaborn:将图例添加到 CDF 图
- postgresql - 根据psql中的某些逻辑拆分字符串
- jenkins - Jenkins JobDSL 推广构建
- flutter - 在 Flutter 中实现 firebase Crashlytics - 找不到参数的方法 classpath()
- java - 如何在 jdbcTemplate.query 函数之外声明 lambda 表达式?