1

writeToFile を使用して pic 画像をドキュメントに保存したいのですが、以下のエラーが見つかりました。解決方法を教えてください。

エラー Domain=NSCocoaErrorDomain Code=512 「操作を完了できませんでした。(Cocoa エラー 512.)」 {NSFilePath=/Users/alexqdh/Library/Application Support/iPhone Simulator/6.0/Applications/xxx/Documents/girl.png , NSUnderlyingError=0x753e630 "操作を完了できませんでした。ディレクトリです"}

-(NSString*)getImagePath:(NSString *)name
{
    NSArray *path =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES);
    NSString *docPath = [path objectAtIndex:0];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *finalPath = [docPath stringByAppendingPathComponent:name];
    [fileManager createDirectoryAtPath:finalPath withIntermediateDirectories:YES attributes:nil error:nil];
    return finalPath;
}
//below is how to use NSData writeToFile
AFImageRequestOperation *opera = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:nil
    success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
    img.image = image;
    [self.view addSubview:img];
    NSData *imageData = UIImagePNGRepresentation(img.image);
    if(imageData == nil)
    {
        NSLog(@"imageData nil");
    }
    NSString *picPath = [self getImagePath:@"girl.png"];
    NSLog(@"path:%@",picPath);
    NSError *error = [[NSError alloc]init];
    BOOL a = [imageData writeToFile:picPath options:NSDataWritingAtomic error:&error];
    if(a == YES)
    {
        NSLog(@"YES");
    }
    else
    {
        NSLog(@"NO.error:%@", error);
    }

    /*NSData *imageData = UIImagePNGRepresentation(img.image);
    NSString *picPath = [self getImagePath:@"girl.png"];
    [imageData writeToFile:picPath atomically:YES];*/

    NSLog(@"Got it.code:%d",response.statusCode);
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
    NSLog(@"Failed pic.error:%@",error);
}];

[opera start];
4

1 に答える 1

7

この問題は、イメージの名前でディレクトリを作成し、そのディレクトリの代わりにファイルを書き込もうとした場合に発生します。つまり、最初に次の名前のディレクトリを作成します。

ドキュメント/girl.png/

次に、パスにファイルを書き込もうとします:

ドキュメント/girl.png

明らかに、これはあなたが意図したことではありません。getImagePath:メソッドで、ディレクトリを作成するための呼び出しを取り除きます。ディレクトリはDocumentsすでに存在します。もちろん、ファイル名に対応するディレクトリは必要ありません。

もう 1 つのオプションは、次のように変更するgetImagePath:ことです。

- (NSString*)getImagePath:(NSString *)name {
    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES);
    NSString *docPath = [path objectAtIndex:0];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *finalPath = [docPath stringByAppendingPathComponent:name];

    // Remove the filename and create the remaining path
    [fileManager createDirectoryAtPath:[finalPath stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil];

    return finalPath;
}

nameこの更新されたコードは、必要なサブディレクトリを含む値を渡すことをサポートするようになりました。

于 2013-01-10T00:30:05.977 に答える