迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

用 C 语言获取文件的扩展属性

作者:迹忆客 最近更新:2023/03/30 浏览次数:

本文将介绍几种如何在 C 语言中获取文件扩展属性的方法。


使用 getxattrlistxattr 函数获取文件的扩展属性

一些基于 UNIX 的系统为文件提供扩展的属性,表示可以与文件关联的元数据的名称/值对。扩展属性需要基础文件系统支持,但是常见文件系统类型具有此功能。扩展属性具有 namespace.name 类型的特定格式,其中 namespace 用于对功能相似的分组,而 name 部分则标识单个扩展属性。命名空间可以具有以下值:usertrustedsystemsecurity,作为一种惯例,它们区分了几种权限类型(在这里有详细描述)。在这种情况下,我们实现了一个例子程序,该程序将多个文件名用作命令行参数,并因此为每个文件检索所有扩展属性。

请注意 ,该程序使用 getopt 函数处理多个文件参数。

getxattr 函数采用四个参数来检索扩展的属性值。第一个参数指定文件系统中的路径,以指示应为其检索 EA 的文件,第二个参数指定属性名称。最后两个参数是指向由 getxattr 存储值的位置的指针,以及该地址上可用的缓冲区大小。请注意,可以通过将值 0 作为大小参数传递来检索属性值的大小,并且调用的返回值是所需缓冲区的字节数。尽管在调用第二个调用以检索该值时,它可能会更改并且大小不同;因此,最好检查错误代码以确保无误执行。

另一方面,listxattr 函数检索给定文件路径的扩展属性名称列表。它包含三个参数,第一个是文件路径。接下来的两个参数表示将存储检索到的列表的缓冲区,缓冲区的大小以字节为单位。

请注意 ,此缓冲区是由调用方分配的,并且调用方负责分配足够的内存。同样,类似于 getxattr,可以将值 0 作为该函数的第三个参数传递,返回值将是存储完整列表所需的缓冲区大小。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
#include <sys/xattr.h>

#define XATTR_SIZE 10000

#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
                               } while (0)


static void usageError(char *progName)
{
    fprintf(stderr, "Usage: %s [-x] file...\n", progName);
    exit(EXIT_FAILURE);
}

int main(int argc, char *argv[]) {
    char list[XATTR_SIZE], value[XATTR_SIZE];
    ssize_t listLen, valueLen;
    int ns, j, k, opt;
    bool hexDisplay;

    hexDisplay = 0;
    while ((opt = getopt(argc, argv, "x")) != -1) {
        switch (opt) {
            case 'x': hexDisplay = 1; break;
            case '?': usageError(argv[0]);
        }
    }

    if (optind >= argc)
        usageError(argv[0]);

    for (j = optind; j < argc; j++) {
        listLen = listxattr(argv[j], list, XATTR_SIZE);
        if (listLen == -1)
            errExit("listxattr");

        printf("%s:\n", argv[j]);

        for (ns = 0; ns < listLen; ns += strlen(&list[ns]) + 1) {
            printf("        name=%s; ", &list[ns]);

            valueLen = getxattr(argv[j], &list[ns], value, XATTR_SIZE);
            if (valueLen == -1) {
                printf("couldn't get value");
            } else if (!hexDisplay) {
                printf("value=%.*s", (int) valueLen, value);
            } else {
                printf("value=");
                for (k = 0; k < valueLen; k++)
                    printf("%02x ", (unsigned char) value[k]);
            }

            printf("\n");
        }

        printf("\n");
    }

    exit(EXIT_SUCCESS);
}

使用 setxattr 函数来设置文件的扩展属性

另外,我们可以使用 setxattr 函数为文件设置任意属性,该函数将文件的路径名,名称/值对作为单独的参数,值的大小,一个整数,该整数指定不同设置操作的预定义值。如果最后一个参数为零(默认值),则扩展属性(如果不存在)将创建;否则,扩展属性将被创建。否则,将替换该值。可以指定 XATTR_CREATE 宏以指示仅创建选项,如果该属性存在则将失败,而可以指定 XATTR_REPLACE 进行替换,如果该属性不存在则将失败。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/xattr.h>


#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
                               } while (0)


static void usageError(char *progName)
{
    fprintf(stderr, "Usage: %s file\n", progName);
    exit(EXIT_FAILURE);
}

int main(int argc, char *argv[]) {
    char *value;

    if (argc < 2 || strcmp(argv[1], "--help") == 0)
        usageError(argv[0]);

    value = "x attribute value";
    if (setxattr(argv[1], "user.x", value, strlen(value), 0) == -1)
        errExit("setxattr");

    value = "y attribute value";
    if (setxattr(argv[1], "user.y", value, strlen(value), 0) == -1)
        errExit("setxattr");

    exit(EXIT_SUCCESS);
}

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便