1

我正在开发基于文档的应用程序,我想使用文档包作为我的文件格式。为此,我需要重写的 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; 
}

上面的代码将这个神秘的错误放入控制台(“Lithograph”是我的应用程序的名称,“.site”是包扩展名):

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

3 回答 3

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;
}
于 2009-10-18T07:36:13.590 回答
0

我能够解决我自己的问题!通过在方法的顶部添加这行代码,我可以在包中操作我想要的任何文件:

[[NSFileManager defaultManager] createDirectoryAtPath:[absoluteURL path] withIntermediateDirectories:YES attributes:nil error:nil];
于 2009-10-18T06:03:37.433 回答
-3

writeToURL... 方法实现应该始终创建一个完整的文档。你的第二个版本似乎没有这样做,所以我不确定你为什么认为它应该工作。

于 2009-10-18T06:18:39.877 回答