如何使用CreateFile()正确打开适配SetFileTime要求的目录
CreateFile 打开目录的正确参数配置 要让CreateFile成功打开目录,且拿到的句柄能直接传给SetFileTime使用,绝对不能套用打开普通文件的参数逻辑,每个入参的正确配置如下,附常见踩坑点:
lpFileName:和普通文件打开规则一致,直接传入目标目录的绝对路径或相对路径即可dwDesiredAccess:- 不要传面向普通文件内容读写的权限位(比如
GENERIC_READ、GENERIC_WRITE),这类权限对目录操作没有实际意义,还会造成不必要的权限占用 - 适配
SetFileTime的最小权限组合是FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,足够完成时间戳修改的操作要求
- 不要传面向普通文件内容读写的权限位(比如
dwShareMode:- 因为目录是系统常驻、会被多进程并发访问的对象,必须传
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,否则很容易因为目录被其他进程占用,触发共享冲突导致打开失败
- 因为目录是系统常驻、会被多进程并发访问的对象,必须传
lpSecurityAttributes:- 无特殊约束,和普通文件的配置逻辑完全一致,通用场景传
NULL使用默认安全描述符即可
- 无特殊约束,和普通文件的配置逻辑完全一致,通用场景传
dwCreationDisposition:- 必须传
OPEN_EXISTING:目录是文件系统已经存在的对象,无法通过CreateFile创建,传其他创建模式(比如CREATE_NEW、OPEN_ALWAYS、CREATE_ALWAYS)会直接调用失败
- 必须传
dwFlagsAndAttributes:- 必须携带
FILE_FLAG_BACKUP_SEMANTICS标志:这是系统允许打开目录句柄的核心判断条件,缺少这个标志时,哪怕其他参数全部正确,调用也会返回INVALID_HANDLE_VALUE,错误码为ERROR_ACCESS_DENIED - 不能搭配普通文件专用的属性位(比如
FILE_ATTRIBUTE_NORMAL),避免属性冲突 - 可按需搭配其他辅助标志(比如
FILE_FLAG_OPEN_REPARSE_POINT用于直接打开符号链接指向的目录本身,而非跳转后的目标)
- 必须携带
hTemplateFile:- 无特殊约束,通用场景传
NULL即可
- 无特殊约束,通用场景传
必看踩坑提醒
用上述配置拿到的目录句柄,不能直接调用
ReadFile、WriteFile这类面向文件内容读写的接口,这类操作会直接返回无效错误;目录句柄仅支持属性查询、时间戳修改、安全描述符调整这类元数据操作。
适配SetFileTime的最小可运行参数示例
HANDLE hTargetDir = CreateFile( L"C:\\绝对路径\\到你的目标目录", FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL );
内容的提问来源于stack exchange,提问作者Bonita Montero
相关产品推荐
相关产品推荐

