You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:30:07