2016-07-25 47 views
0

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; 
      } 
     } 
    } 
} 
+0

Hallo, was ist die Rückgabe von "- (BOOL) fileExistsAtPath: (NSString *) Pfad" bevor Sie die Datei löschen? – Estevex

+0

@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

+0

Möchten Sie das gerade gelöschte Bild speichern? Vielleicht versucht 'UIImagePNGRepresentation' das Bild zu laden. – Willeke

Antwort

0

ich dies mit speichern und zu lesen:

- (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]]; 
} 
+0

Ja, aber was tun Sie, um eine Datei zu löschen? Was passiert, wenn die Größe der App zu groß wird? Wie überschreiben Sie auch eine Datei? – Supertecnoboff

+0

Ich würde mit dieser Methode überschreiben: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/index.html#//apple_ref/occ/instm/NSFileManager/createFileAtPath:contents : Über die App Größe mach dir keine Sorgen über das, es sei denn, Sie denken über die Speicherung von GBs Bilder – Estevex

+0

Hmmm ... durch viele Artikel und Apple Dev-Dokumente gegangen bin, im beginnen zu denken, dass ich vielleicht nicht einmal bin Ich möchte nur eine Datei speichern und dann entweder eine neue Datei unter einem anderen Namen speichern oder die vorhergehende überschreiben, ich kann wirklich nichts finden g, die detailliert beschreibt, wie NSFileManager Dateien löscht. – Supertecnoboff