1

我正在研究 [我的应用程序运行的] 会话之间维护状态的不同方法。

[来自#ubuntu IRC 聊天] 向我建议的一种 [非便携式] 方法是利用man xattr

扩展属性是与文件和目录永久关联的名称:值对,类似于与进程关联的环境字符串。

源代码:https ://github.com/torvalds/linux/blob/master/fs/xattr.c

如果我能让它工作,这对我来说非常有用。虽然我不是 ac 或内核开发人员,但不能完全解析我如何将键值对映射到文件。

到目前为止我所拥有的:

#include <QApplication>
#include <QTextStream>
#include <stdio.h>
#include <sys/xattr.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    char key[] = "foo";
    char val[] = "bar";
    char dir[] = "/home/akiva/foobar.txt";
    ssize_t set = setxattr (dir, key, val, strlen(val), 0); // Returns -1[error]
    ssize_t get = listxattr(dir, key,      strlen(val)   ); // Returns  0
    QTextStream(stdout) << QString("SetError: %1 \n"
                                   "GetError: %2 \n"
                                   "     Key: %3 \n"
                                   "     Val: %4 \n").arg(set).arg(get).arg(key).arg(val);

    return a.exec();
}

我不确定为什么setxattr会给我一个错误,也不知道我应该期待什么listxattr似乎运行良好。我希望能够或为我的文件set创建一key:value对。foobar.txt在这种情况下,"foo":"bar"。随后,在设置之后,我希望能够从文件中获取值/home/akiva/foobar.txt,类似于以下内容:

FileClass fc("/home/akiva/foobar.txt"); // A class I will make, similar to QMap
{
        fc.insert("foo", "bar");
        fc.insert("bow", "tie");
}
QString s   = fc["foo"];          // s == "bar"
bool hasFoo = fc.contains("foo"); // true
bool hasDoo = fc.contains("doo"); // false
QStringList keys = fc.keys  ();   // "foo", "bow"
QStringList vals = fc.values();   // "bar", "tie"

在课堂上,我将处理所有限制等。无论如何,我想获得一个能够从我的文件中设置和获取键值对的工作示例,但我无法在任何地方找到一个示例。

  • 如何set使用 Key:Value 对文件进行键值对xattr
  • 如何get使用文件中的键:值对xattr
  • 文件通常具有现有的扩展属性吗?
4

0 回答 0