removeItemAtPath 后 writeToFile 不起作用

writeToFile does not work after removeItemAtPath

我有一个 iOS 应用程序,有时需要在本地存储 UIImage 对象。

我正在使用 [UIImagePNGRepresentation(image) writeToFile:full_path options:NSAtomicWrite error:nil]; 保存图片,[file_manager removeItemAtPath:full_path error:NULL]; 删除文件。

这一切都很好,但是,每当我删除一个文件时,我是否应该决定保存一个新文件(恰好与旧文件同名),保存代码不起作用并且returns 出现以下错误:

: ImageIO: CGImageReadCreateDataWithMappedFile 'open' failed error = 2 (No such file or directory)

: ImageIO: CGImageReadCreateDataWithMappedFile 'open' failed error = 2 (No such file or directory)

: ImageIO: PNG zlib error

所以这是我不明白的,为什么我删除旧文件后不能保存与旧文件同名的文件?

我问这个的原因是,我的应用程序会保存某些图像文件,然后当不再需要它们时,我的应用程序会删除它们。但是,有时我的应用程序再次需要图像文件(可能是删除后几个小时或几周)。发生这种情况时,我的应用程序将加载适当的图像数据,然后尝试保存它。那就是错误发生的时候。

这里出了什么问题?

谢谢你的时间,丹。

更新 - 这是我设置为 save/access 并删除我的图像文件的方法

-(void)save_local_image:(UIImage *)image :(NSString *)file_name {

    // Get the app documents directory link.
    NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    // Add the new file name to the link.
    NSString *database_link = [[NSString alloc] initWithString:[documents stringByAppendingPathComponent:file_name]];

    // Save the image data locally.
    [UIImagePNGRepresentation(image) writeToFile:database_link options:NSAtomicWrite error:nil];
}

-(UIImage *)get_local_image:(NSString *)file_name {

    // Create the return data.
    UIImage *image_data = nil;

    // Get the app documents directory.
    NSArray *directory = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] error:NULL];

    // Only check for data if at least
    // one file has been saved locally.

    if ([directory count] > 0) {

        // Loop through the different local files.

        for (NSString *path in directory) {

            // Get the full local file URL.
            NSString *full_path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:path];

            // Get the range of the file name.
            NSRange range = [full_path rangeOfString:file_name];

            // Get the image data if it exists.

            if ((range.location != NSNotFound) || (range.length == [file_name length])) {

                // Load the image file in.
                image_data = [UIImage imageWithContentsOfFile:full_path];

                break;
            }
        }
    }

    return image_data;
}

-(void)delete_local_image:(NSString *)file_name {

    // Get the app documents directory.
    NSArray *directory = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] error:NULL];

    // Only check for data if at least
    // one file has been saved locally.

    if ([directory count] > 0) {

        // Loop through the different local files.

        for (NSString *path in directory) {

            // Get the full local file URL.
            NSString *full_path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:path];

            // Get the range of the file name.
            NSRange range = [full_path rangeOfString:file_name];

            // Delete the local image data if it exists.

            if ((range.location != NSNotFound) || (range.length == [file_name length])) {

                NSError *testError = nil;

                // Delete the image file.
                NSFileManager *file_manager = [[NSFileManager alloc] init];
                BOOL success = [file_manager removeItemAtPath:full_path error:&testError];

                NSLog(@"%d", success);

                if (testError != nil) {
                    NSLog(@"%@", testError.localizedDescription);
                }


                break;
            }
        }
    }
}

我正在使用它来保存和阅读:

- (void) saveImageToFile:(NSString *) urlImg withNameNumber:(int)numberName andQuestionId:(int) questionID
{

 NSString* documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
 NSString* foofile = [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"gallery%d%d.jpg",numberName,questionID]];
 BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:foofile];

 if (!fileExists) {
    NSData *tempImgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",@"https://testurl/",urlImg]]];
    NSString *filename = [NSString stringWithFormat:@"gallery%d%d.jpg",numberName,questionID];
    NSString *imagePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:filename];
    [tempImgData writeToFile:imagePath atomically:YES];
 }
}

-(UIImage*) readImageFromFile:(int)numberName andQuestionId:(int) questionID
{
  NSString * documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

  return [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/gallery%d%d.jpg",documentsDirectoryPath,numberName,questionID]];
}