Ich habe eine iOS-App, die manchmal UIImage-Objekte lokal speichern muss.WriteToFile funktioniert nicht nach removeItemAtPath
Ich verwende [UIImagePNGRepresentation(image) writeToFile:full_path options:NSAtomicWrite error:nil];
, um das Bild zu speichern und [file_manager removeItemAtPath:full_path error:NULL];
, um die Datei zu löschen.
Das funktioniert alles gut, aber wenn ich eine Datei lösche, sollte ich entscheiden, eine neue Datei zu speichern (die zufällig denselben Namen wie die alte Datei hat), der Speichercode funktioniert nicht und kehrt zurück der folgende Fehler:
: 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
here Also, was ich nicht bekommen, warum kann ich nicht eine Datei mit dem gleichen Namen wie die alten Datei zu speichern, nachdem ich die alte Datei gelöscht habe?
Der Grund, warum ich dies frage, ist, dass meine App bestimmte Bilddateien speichert und sie dann, wenn sie nicht mehr benötigt werden, von meiner App gelöscht werden. Es gibt jedoch Zeiten, in denen meine App die Bilddateien erneut benötigt (möglicherweise ein paar Stunden nach dem Löschen oder ein paar Wochen). In diesem Fall lädt meine App die entsprechenden Bilddaten und versucht dann, sie zu speichern. Und das ist, wenn der Fehler auftritt.
Was läuft hier falsch?
Danke für Ihre Zeit, Dan.
UPDATE - Hier sind die Methoden, die ich Setup speichern/Zugang und löschen meine Bilddateien
-(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;
}
}
}
}
Hallo, was ist die Rückgabe von "- (BOOL) fileExistsAtPath: (NSString *) Pfad" bevor Sie die Datei löschen? – Estevex
@Estevex Ich überprüfe das nicht einmal, ich benutze nur NSRange, um zu sehen, ob meine Datei existiert. Ich habe meine Frage mit meinem Code aktualisiert. Wenn Sie den Code nach unten scrollen, sehen Sie meine Methode zum Löschen von Dateien. – Supertecnoboff
Möchten Sie das gerade gelöschte Bild speichern? Vielleicht versucht 'UIImagePNGRepresentation' das Bild zu laden. – Willeke