0

setxattr コマンドを使用して、iOS および Mac ファイルの拡張ファイル属性を調べています。私が理解していることから、最大128kbまでの任意のデータをそこに保存できます。

文字列ポインターを逆参照するのではなく、辞書を扱っているかのように拡張属性を読み書きするにはどうすればよいですか?

これまでのところ、単一の属性を設定しようとするこのコードがあります。

NSString* filepath = [MyValueObject filepath]; 
const char *systemPath = [filepath fileSystemRepresentation];
const char *name = "special_value";
const char *value = "test string";

int result = setxattr(systemPath, name, &value, strlen(value), 0, 0);

小さな値のセット (たとえば 5 つのキーと値のペア) を保存する必要がある場合は、次のことを考えています。

  1. 自分の属性で NSDictionary を作成する
  2. 辞書を JSON 文字列に変換する
  3. 文字列を文字ポインタに変換する
  4. 拡張属性への文字列の書き込み
  5. 属性を読み戻すには、文字列ポインタを読み戻します
  6. NSString に変換
  7. JSON オブジェクトに変換
  8. 辞書を作成する
  9. 辞書から値を取得する

これは正しいアプローチのように思えますか? メタデータを拡張属性に保存する簡単な方法はありますか? xattr のポインター操作を処理する NSObject のカテゴリがあるのではないでしょうか?

4

2 に答える 2

1

xattr への任意の文字列の読み取り/書き込みを可能にする Cocoanetics/DTFoundation を見つけました

#import "Note+ExtendedAttribute.h"
#include <sys/xattr.h>


@implementation MyFile (ExtendedAttribute)

-(NSString*)dictionaryKey
{
    return @"mydictionary";
}

-(BOOL)writeExtendedAttributeDictionary:(NSDictionary*)dictionary
{
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary
                                                       options:0
                                                         error:&error];
    if (! jsonData) {
        return NO;
    }

    NSString* jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];



    const char *filepath = [[self filepath] fileSystemRepresentation];

    const char *key = [[self dictionaryKey] UTF8String];
    const char *value = [jsonString UTF8String];

    int result = setxattr(filepath, key, value, strlen(value), 0, 0);

    if(result != 0)
    {
        return NO;
    }

    return YES;
}

読む:

-(NSMutableDictionary*)readExtendedAttributeDictionary
{
    const char *attrName = [[self dictionaryKey] UTF8String];
    const char *filePath = [[self filepath] fileSystemRepresentation];

    // get size of needed buffer
    int bufferLength = getxattr(filePath, attrName, NULL, 0, 0, 0);

    if(bufferLength<=0)
    {
        return nil;
    }

    // make a buffer of sufficient length
    char *buffer = malloc(bufferLength);

    // now actually get the attribute string
    getxattr(filePath, attrName, buffer, bufferLength, 0, 0);

    // convert to NSString
    NSString *retString = [[NSString alloc] initWithBytes:buffer length:bufferLength encoding:NSUTF8StringEncoding];

    // release buffer
    free(buffer);

     NSData *data = [retString dataUsingEncoding:NSUTF8StringEncoding];
    if(data == nil || data.length == 0)
    {
        return nil;
    }

    NSError *error = nil;
    id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

    if([json isKindOfClass:[NSDictionary class]])
    {
        return [NSMutableDictionary dictionaryWithDictionary:json];
    }

    if(error)
    {
        return nil;
    }


    return json;
}
于 2014-08-20T15:36:13.647 に答える
0

辞書をバイナリplistに変換し、それを書きます-そしてその逆:)

書く:

  1. 辞書を作成する
  2. バイナリ plist を作成する
  3. 書いてください

--

読んだ:

  1. バイナリ plist を読み取る
  2. そこから辞書を作る
于 2014-08-20T15:00:35.637 に答える