英文:
How to check for read and write permission in C++ using std::filesystem
问题
I have a unix codebase that is using access(path, W_OK) and access(path, R_OK), available in unistd.h, in order to see if the file is writeable/readable.
Examples at the end of the page here.
我有一个Unix代码库,使用unistd.h 中的 access(path, W_OK) 和 access(path, R_OK) 来检查文件是否可写/可读。示例在此处页面的末尾。
I have seen that Windows offer the same function, under the name of _access, but I wanted an implementation leveraging only std::filesystem available in C++17.
我注意到Windows提供了相同的函数,以_access的名称,但我想要一个仅使用C++17中可用的std::filesystem来实现的版本。
I thought about using std::filesystem::perms and perform a manual check for both read and write, but how can I perfectly mimic the checks made by access?
我考虑使用std::filesystem::perms并执行手动检查以进行读取和写入,但如何完美地模拟access所进行的检查?
英文:
I have a unix codebase that is using access(path, W_OK) and access(path, R_OK), available in unistd.h, in order to see if the file is writeable/readable.
Examples at the end of the page here.
I have seen that Windows offer the same function, under the name of _access, but I wanted an implementation leveraging only std::filesystem available in C++17.
I thought about using std::filesystem::perms and perform a manual check for both read and write, but how can I pefectly mimick the checks made by access?
答案1
得分: 2
请参考cppreference中的参考文档。
如果你想要检查权限,可以使用以下代码:
std::filesystem::status("filename").permissions()
这将返回权限列表。你可以使用类似以下的方法:
#include <filesystem>
#define F_OK 0
#define R_OK 1
#define W_OK 2
#define X_OK 3
namespace fs = std::filesystem;
int access(const fs::path& path, int amode){
auto a = fs::status(path).permissions();
switch(amode){
case F_OK:
return fs::perms::unknown != a ? 0 : -1;
case R_OK:
return (fs::perms::owner_read & a) == fs::perms::owner_read ? 0 : -1;
case W_OK:
return (fs::perms::owner_read & a) == fs::perms::owner_read && (fs::perms::owner_write & a) == fs::perms::owner_write ? 0 : -1;
case X_OK:
return (fs::perms::owner_read & a) == fs::perms::owner_read && (fs::perms::owner_exec & a) == fs::perms::owner_exec ? 0 : -1;
default:
return -1;
}
}
这可能不会按照你的期望工作,因为你甚至不知道文件所有者是你还是我,或者我是否与群组所有者在同一组。你需要检查每种情况,例如,"read"是否可操作,无论文件是否具有owner_read
,以及您是否是文件所有者,或者文件是否具有group_read
,以及您是否与文件所有者在同一组,或者文件是否具有others_read
。这使事情变得更加复杂。
你需要检查类似的内容,我猜这很复杂。
或者,你可以在Unix上轻松使用fstat,在Windows上使用GetFileAttributes,并在你的代码中检查系统是否是Unix或Windows。
英文:
See the reference cppreference
If you want to check you can use this:
std::filesystem::status("filename").permissions()
That will give you list of permissions. And you can use some approach like this:
#include <filesystem>
#define F_OK 0
#define R_OK 1
#define W_OK 2
#define X_OK 3
namespace fs = std::filesystem;
int access(const fs::path& path, int amode){
auto a=fs::status(path).permissions();
switch(amode){
case F_OK:
return fs::perms::unknown!=a? 0 : -1;
case R_OK:
return (fs::perms::owner_read & a) == fs::perms::owner_read ? 0 : -1;
case W_OK:
return (fs::perms::owner_read & a) == fs::perms::owner_read && (fs::perms::owner_write & a) == fs::perms::owner_write ? 0 : -1;
case X_OK:
return (fs::perms::owner_read & a) == fs::perms::owner_read && (fs::perms::owner_exec & a) == fs::perms::owner_exec ? 0 : -1;
default:
return -1;
}
}
This might not work as you expected because I don't even controlled file owner is me or Am I in same group with group owner. You need to check each case, for example," read can be operate, whether file have owner_read
and you are the file owner or file have group_read
and you are same group with file owner or file have others_read
"
It makes something more complicated.
You need to check something like that and it is so complex I guess.
Or you can easily use fstat for Unix and GetFileAttributes for Windows and in your code just check whether your system is Unix or Windows using directives.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论