2016-07-15 67 views
3

我想让我的应用程序文件系统保存关于其中每个文件的元数据,但也支持在用户端创建目录。我看过NSFileWrapper,但它似乎将元数据保存为目录的文件。这是有道理的,但现在如何区分实际目录和NSFileWrapper目录?或者我应该在每个目录中使用隐藏的plist文件跟踪元数据?预先感谢任何帮助!区分NSFileWrapper和目录?

+1

它看起来像'setxattr'可能对这项工作。 http://nshipster.com/extended-file-attributes/ –

+0

@LukeVanIn这绝对是真棒。你能否将这一点形容为某种答案,并引用了它的使用情况?像TextMate一样? –

回答

1

您可以使用setxattr在文件上存储元数据的额外键/值对。 Mattt Thompson撰写了关于NSHipster的优秀深度文章。

这里是例如从制品,显示出如何设置的属性值:在其上支持扩展的元数据属性的Mac文件系统

#include <sys/xattr.h> 
const char *filePath = [fileURL fileSystemRepresentation]; 
const char *name = "com.Example.Etag"; 
const char *value = [[response allHeaderFields][@"Etag"] UTF8String]; 
int result = setxattr(filePath, name, value, strlen(value), 0, 0); 

setxattr作品。在OS X和iOS上,这由HFS +支持,其中元数据存储在资源分支中,最大大小限制为128KB。

您可以使用listxattr来检索可用标签。使用getxattr检索特定标签的值。

使用此应用程序的一个示例是TextMate,它存储状态信息,例如当前插入符号位置,书签和行折叠。

重要的是要注意元数据是不稳定的,不应该依赖于保留关键信息。

  1. 元数据可以被移动/改变/剥离出于各种原因,诸如被存储在不支持扩展的元数据(例如FAT32)文件系统,或通过压缩,网络,或其他被意外地或故意地改变文件处理软件。
  2. 元数据是一个共享的命名空间,这对于与其他应用程序的互操作性非常有用,但也容易受到干扰。为避免名称冲突,密钥名称应以唯一标识符(即域名)作为前缀。

其他参考: