使用纯文本文件存储任意元数据

Jak*_*mpl 8 cocoa objective-c

我正在编写一个文本编辑器,我需要存储一些信息(通常只是几个字符串;存储不需要特别耐用)与应用程序保存的每个文件(不包含文本文件的一部分)因为其他应用可能会阅读它,而且信息仅针对我的应用).

我该怎么做?


更多信息:我有一个NSDocument设置,我想简单地存储一个NSString实例变量作为每个文件元数据.根据下面的答案,我提出了这个问题,这个问题目前存在问题并导致程序在启动时崩溃:

#import <sys/xattr.h>
@interface MyDocument : NSDocument {
  NSString *metadatum;
}

@implementation MyDocument 

- (BOOL)writeToURL:(NSURL *)url ofType:(NSString *)type error:(NSError **)err
{
  BOOL output = [super writeToURL:url ofType:type error:err];
  if(!setxattr([[url path] cStringUsingEncoding:NSUTF8StringEncoding], 
               "eu.gampleman.xattrs.style", 
               [metadatum cStringUsingEncoding:NSUTF8StringEncoding], 
               sizeof(char) * [styleName length], 0, 0)) 
  {
      NSLog(@"Write failure");
  }
  return output;
}

- (BOOL)readFromURL:(NSURL *)url ofType:(NSString *)type error:(NSError **)err {
  char *output;
  ssize_t bytes = getxattr([[url path] cStringUsingEncoding:NSUTF8StringEncoding],
                           "eu.gampleman.xattrs.style", &output, 1024, 0, 0);
  if (bytes > 0) {
    metadatum = [[NSString alloc] initWithBytes:output length:bytes 
          encoding:NSUTF8StringEncoding]; // <- crashes here with "EXC_BAD_ACCESS"
  }
  return [super readFromURL:url ofType:type error: err];
}

// ...
// fairly standard -dataOfType:error: and 
// -readFromData:ofType:error: implementations
Run Code Online (Sandbox Code Playgroud)

PS:如果你的答案非常好(有示例代码等),我将奖励100rep赏金.

Ken*_*ses 13

使用扩展属性.请参阅setxattr().

这是一个写字符串的示例调用:

NSData* encodedString = [theString dataUsingEncoding:NSUTF8StringEncoding];
int rc = setxattr("/path/to/your/file", "com.yourcompany.yourapp.yourattributename", [encodedString bytes], [encodedString length], 0, 0);
if (rc)
    /* handle error */;
Run Code Online (Sandbox Code Playgroud)

要读取字符串:

ssize_t len = getxattr("/path/to/your/file", "com.yourcompany.yourapp.yourattributename", NULL, 0, 0, 0);
if (len < 0)
    /* handle error */;
NSMutableData* data = [NSMutableData dataWithLength:len];
len = getxattr("/path/to/your/file", "com.yourcompany.yourapp.yourattributename", [data mutableBytes], len, 0, 0);
NSString* string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

PS:在回答问题之前,你不必在问题上设置赏金吗?

  • Ken提供了一个答案,其中包含用于读取和编写特定于您需求的xattrs的示例代码.您认为还需要什么才能获得赏金? (3认同)