如何使用Boost库修改Windows系统下的文件权限?
Boost库在Windows下修改文件权限的问题解答
是否可以用Boost修改Windows文件权限?
可以,但支持非常有限。Boost.Filesystem的权限模型基于Unix系统设计,和Windows的ACL(访问控制列表)权限体系不匹配。你代码里用到的owner_write、group_write、others_write这些Unix风格权限位,在Windows环境下Boost并不会处理,所以执行后没有效果。仅修改文件的只读属性这种简单操作,Boost可以实现,对应用法如下:
- 设置文件为只读:
boost::filesystem::permissions(file_path, boost::filesystem::add_perms | boost::filesystem::owner_read); - 取消只读属性(允许写入):
boost::filesystem::permissions(file_path, boost::filesystem::remove_perms | boost::filesystem::owner_read);
- 设置文件为只读:
复杂权限控制必须用Win32 API吗?
是的。如果需要给特定用户/组设置读写、执行等精细化权限,Boost无法满足,必须使用Win32 API直接操作ACL。比如给文件添加「Everyone」组的写入权限,可通过GetNamedSecurityInfo、SetEntriesInAcl、SetNamedSecurityInfo等函数实现,示例代码如下:#include <windows.h> #include <aclapi.h> bool AddEveryoneWritePermission(const wchar_t* filePath) { DWORD dwError = 0; PACL pOldDacl = nullptr; PACL pNewDacl = nullptr; PSECURITY_DESCRIPTOR pSD = nullptr; // 获取文件现有安全描述符 dwError = GetNamedSecurityInfoW(filePath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nullptr, nullptr, &pOldDacl, nullptr, &pSD); if (dwError != ERROR_SUCCESS) goto Cleanup; // 定义允许Everyone写入的访问规则 EXPLICIT_ACCESSW ea; ZeroMemory(&ea, sizeof(EXPLICIT_ACCESSW)); ea.grfAccessPermissions = GENERIC_WRITE; ea.grfAccessMode = SET_ACCESS; ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT; ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME; ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; ea.Trustee.ptstrName = L"Everyone"; // 合并规则到现有权限列表 dwError = SetEntriesInAclW(1, &ea, pOldDacl, &pNewDacl); if (dwError != ERROR_SUCCESS) goto Cleanup; // 应用新权限到文件 dwError = SetNamedSecurityInfoW(filePath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nullptr, nullptr, pNewDacl, nullptr); Cleanup: if (pSD) LocalFree(pSD); if (pNewDacl) LocalFree(pNewDacl); return dwError == ERROR_SUCCESS; }
内容的提问来源于stack exchange,提问作者yanran
相关产品推荐
相关产品推荐

