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 ...メソッドの実装では、常に完全なドキュメントを作成する必要があります。あなたの2番目のバージョンはそれをしていないようです、それであなたがそれがうまくいくと思う理由がわかりません。

于 2009-10-18T06:18:39.877 に答える