Я пишу текстовый редактор, и мне нужно будет хранить несколько фрагментов информации (как правило, всего несколько строк, а хранение не обязательно должно быть особенно долговечным) с каждым файлом приложение сохраняет (без того, чтобы быть частью текстового файла, поскольку другие приложения могли его прочитать, а информация касается только моего приложения).Сохранение произвольных метаданных с текстовым файлом
Как бы я это сделал?
Дополнительная информация: У меня есть 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
PS: Если ваш ответ действительно хорош (с примерами кода, и т.д. .), Я награду 100-кратной наградой.
Используйте '- [NSString fileSystemRepresentation]' вместо '-cStringUsingEncoding:'. Длина 'NSString' находится в символах UTF-16, которая не совпадает с длиной символов UTF-8 (за исключением чистого ASCII). Вызов 'getxattr()' передает указатель на указатель, который содержит 4 или 8 байтов памяти, но говорит, что это 1024 байта. Вероятно, вы повредили стек или кучу. Вы должны выделить хранилище нужного размера. –