2009-10-18 2 views
1

Я работаю над документированным приложением, и я хочу использовать пакет документов в качестве формата файла. Для этого кажется, что метод NSDocument, который мне нужно переопределить, равен
-writeToURL:ofType:error:.Проблема с NSDocument и writeToURL: ofType: error:

Это иногда работает, но только при определенных условиях. Например, этот код работает:

- (BOOL)writeToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError 
{ 
    NSFileWrapper *wrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil]; 
    [wrapper addRegularFileWithContents:[@"please work" dataUsingEncoding:NSUTF8StringEncoding] preferredFilename:@"foobar"]; 
    [wrapper writeToURL:absoluteURL options:NSFileWrapperWritingAtomic originalContentsURL:nil error:outError]; 

    NSDictionary *metadata = [NSDictionary dictionaryWithObject:@"0.1" forKey:@"Version"]; 
    NSURL *mdURL = [NSURL fileURLWithPath:[[absoluteURL path] stringByAppendingPathComponent:@"SiteInfo.plist"]]; 
    [metadata writeToURL:mdURL atomically:YES]; 

    return YES; 
} 

Но этот код не (это то же самое, что и выше, но с NSFileWrapper бит вынимают):

- (BOOL)writeToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError 
{ 
    NSDictionary *metadata = [NSDictionary dictionaryWithObject:@"0.1" forKey:@"Version"]; 
    NSURL *mdURL = [NSURL fileURLWithPath:[[absoluteURL path] stringByAppendingPathComponent:@"SiteInfo.plist"]]; 
    [metadata writeToURL:mdURL atomically:YES]; 

    return YES; 
} 

Приведенный выше код ставит эту загадочную ошибку в консоль («Литография» это имя моего приложения, и «.Выходный» является расширение пакета):

NSDocument could not delete the temporary item at file://localhost/private/var/folders/qX/qXL705byGmC9LN8FpiVjgk+++TI/TemporaryItems/(A%20Document%20Being%20Saved%20By%20Lithograph%207)/Untitled%20Site.site. Here's the error: 
Error Domain=NSCocoaErrorDomain Code=4 UserInfo=0x10059d160 "“Untitled Site.site” couldn’t be removed." 

у меня есть написать что-то к исходному URL прежде чем я могу добавить другие файлы в пакет?

ответ

4

Если вы создаете обертку файла из своего документа, вы должны использовать -fileWrapperOfType:error: вместо -writeToURL:ofType:error:.

Вы бы построить файл обертку для Info.plist файла, вставьте его в файл папки оболочки, а затем вернуть обертку папку:

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError 
{ 
    NSFileWrapper *wrapper = [[[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil] autorelease]; 
    [wrapper addRegularFileWithContents:[@"please work" dataUsingEncoding:NSUTF8StringEncoding] preferredFilename:@"foobar"]; 
    NSDictionary *metadata = [NSDictionary dictionaryWithObject:@"0.1" forKey:@"Version"]; 
    NSString* errorDescription = nil; 
    NSData* dictionaryData = [NSPropertyListSerialization dataFromPropertyList:metadata format:NSPropertyListBinaryFormat_v1_0 errorDescription:&errorDescription]; 
    if(!dictionaryData) 
    { 
     if(!errorDescription) 
      errorDescription = @"Unknown error"; 
     if(outError) 
      *outError = [NSError errorWithDomain:@"YourErrorDomain" code:69 userInfo:[NSDictionary dictionaryWithObject:errorDescription forKey:NSLocalizedDescriptionKey]]; 
     return nil; 
    } 
    [wrapper addRegularFileWithContents:dictionaryData preferredFilename:@"Info.plist"]; 
    return wrapper; 
} 
+0

Спасибо за помощь! Я не знал о 'NSPropertyListSerialization'; это должно пригодиться. –

0

Я смог решить свою проблему! Добавив эту строку коды в верхней части методы, я в состоянии манипулировать все файлы, которые я хочу в пакете:

[[NSFileManager defaultManager] createDirectoryAtPath:[absoluteURL path] withIntermediateDirectories:YES attributes:nil error:nil]; 
+2

Никогда не передавайте 'nil' для' ошибки: '. Прежде всего, это указатель на указатель, а не указатель на объект, поэтому правильным нулевым значением является «NULL». Что еще более важно, вы скрываете ошибки пользователя. Если у них нет разрешения на запись в это место, тогда это сообщение попытается дать вам объект ошибки, но вы отказались его получить, поэтому вы не можете его представить, поэтому ** ваше приложение будет тихо работать сохранить**. –

-3

writeToURL ... реализация метод всегда должен создать полный документ. Ваша вторая версия, похоже, не делает этого, поэтому я не уверен, почему вы думаете, что она должна работать.

Смежные вопросы