Linux环境下C++读取文件权限、属主组及复制权限的方法求助
Linux下C++读取文件权限、属主组并复制到另一个文件
在Linux环境中,并没有直接的getmod()或getown()函数,要读取文件的权限、属主和组信息,需要使用stat()或lstat()系统调用(lstat()会跳过符号链接,直接读取链接本身的属性)。以下是具体实现方法和示例代码:
读取并复制文件权限
通过stat()获取源文件的struct stat结构体,其中st_mode字段包含文件的权限位。需要用& 0777过滤掉文件类型标识,提取出纯权限位,之后用chmod()将该权限应用到目标文件。
读取并复制文件属主和组
同样通过stat()获取源文件的st_uid(属主用户ID)和st_gid(属主组ID),再用chown()将这些ID设置到目标文件。注意:调用chown()通常需要root权限,或者进程拥有目标文件的属主权限。
完整示例代码
#include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <iostream> #include <cstring> #include <errno.h> int main(int argc, char* argv[]) { if (argc != 3) { std::cerr << "用法: " << argv[0] << " <源文件路径> <目标文件路径>" << std::endl; return 1; } const char* src_path = argv[1]; const char* dst_path = argv[2]; struct stat src_attr; // 读取源文件属性 if (stat(src_path, &src_attr) == -1) { std::cerr << "读取源文件属性失败: " << strerror(errno) << std::endl; return 1; } // 复制权限到目标文件 if (chmod(dst_path, src_attr.st_mode & 0777) == -1) { std::cerr << "设置目标文件权限失败: " << strerror(errno) << std::endl; return 1; } // 复制属主和组到目标文件 if (chown(dst_path, src_attr.st_uid, src_attr.st_gid) == -1) { std::cerr << "设置目标文件属主/组失败: " << strerror(errno) << std::endl; return 1; } std::cout << "文件属性复制完成" << std::endl; return 0; }
补充说明
- 如果需要读取符号链接本身的属性(而非链接指向的文件),将
stat()替换为lstat()即可。 - 编译命令:
g++ file_attr_copy.cpp -o file_attr_copy - 修改属主/组时可能需要sudo权限:
sudo ./file_attr_copy src.txt dst.txt
内容的提问来源于stack exchange,提问作者TSG
相关产品推荐
相关产品推荐

