2012-05-16 14 views
11

Ich habe ein Problem mit der Verwendung der NSFileManager-Funktionen. Dies geschieht sowohl auf dem Simulator als auch auf einem iPhone-Gerät (iOS 5.1).NSFileManager löscht keine Datei, die existiert

Grundsätzlich habe ich eine Reihe von Dateien, die in einem Dokument gespeichert sind, das ich erstellt habe. Jetzt versuche ich eine Datei (im Pfad gespeichert) in das gleiche Verzeichnis mit einem anderen Namen zu verschieben, um zu prüfen, ob das Löschen funktioniert.

if ([[NSFileManager defaultManager] isDeletableFileAtPath:path]) { 
BOOL success = [[NSFileManager defaultManager] moveItemAtPath:path toPath:[path   stringByAppendingString:@".deleted"] error:&error]; 
if (!success) { 
     NSLog(@"Error removing file at path: %@", error.localizedDescription); 
    } 
} 

Der Ausgang dieses ist beide Dateien auf Pfad und Weg .deleted. Ich möchte schließlich nur die Datei mit RemoveItemAtPath entfernen, aber das funktioniert nicht. Es gibt einen Erfolg zurück, aber wenn ich es im Dateiverzeichnis sehe, kann ich es noch nach einer Stunde dort sehen.

Antwort

33

Wenn Sie eine Datei löschen Sie removeItemAtPath:myPath error:NULL wie

NSError *error; 
if ([[NSFileManager defaultManager] isDeletableFileAtPath:path]) { 
    BOOL success = [[NSFileManager defaultManager] removeItemAtPath:path error:&error]; 
    if (!success) { 
     NSLog(@"Error removing file at path: %@", error.localizedDescription); 
    } 
} 
+0

Ich habe das auch versucht, aber es funktioniert auch nicht. Das Problem ist nur, dass, egal ob ich moveItemAtPath oder deleteItemAtPath verwende, die Datei at path nicht gelöscht wird. – Devang

+0

Ich habe das Problem in meinem Code gefunden. Es war nur so, dass ich irgendwo einen NSTimer gestartet hatte, der die Datei alle paar Sekunden speichern würde. Selbst nach dem Löschen wurde die Datei erneut geschrieben, was den Eindruck erweckte, dass sie nicht gelöscht wird. Ich akzeptiere diese Antwort, wie es technisch korrekt ist. – Devang

+1

Ich würde auch vorschlagen, fileExistsAtPath mit Ihrer Logik hinzuzufügen.Mir ist aufgefallen, dass isDeletableFileAtPath nach dem Löschen/Löschen der Datei immer noch für eine Weile true zurückgibt, aber fileExistsAtPath ist immer korrekt. – user3344977

1

Verwenden Sie diese für Suchpfad verwendet werden soll, und löschen Sie ein Video

(NSString *)applicationDocumentsDirectory { 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
    return basePath; 
    } 
NSString *dataFilePath = [[[self applicationDocumentsDirectory] 
           stringByAppendingPathComponent:@"Data.nosync"] 
           stringByAppendingPathComponent:[NSString stringWithFormat:@"%@-%@.mp4",[dicForDelete valueForKey:keyVideoId],[dicForDelete valueForKey:keyVideoName]]]; 
NSError *error; 
if ([[NSFileManager defaultManager] isDeletableFileAtPath:dataFilePath]) { 
     BOOL success = [[NSFileManager defaultManager] removeItemAtPath:dataFilePath error:&error]; 
     if (success) { 
      [email protected]"file deleted "); 
     }else 
     { 
     [email protected]"file not deleted "); 
     } 
    } 
1

ich in der gleichen Ausgabe lief. Ich bin immer noch verwirrt darüber, warum das Update funktioniert, aber es ist erwähnenswert, falls andere es erklären können.

Ich entdeckte, dass [[NSFileManager defaultManager] removeItemAtURL:url error:&error] würde beim ersten Versuch falsch zurückgeben, aber mit einem Null-Fehler. Beim zweiten Versuch würde es wahr werden.

Hier ist, was mein Code aussah:

// success == NO error = nil 
BOOL success = [[NSFileManager defaultManager] removeItemAtURL:storeUrl error:&error]; 

// success == YES error = nil 
success = [[NSFileManager defaultManager] removeItemAtURL:storeUrl error:&error]; 

ich entdeckt, wenn ich meine eigene NSFileManager Instanz erstellt, wäre es auf dem ersten Versuch arbeiten.

NSFileManager *fm = [[NSFileManager alloc] init]; 
[fm removeItemAtURL:storeUrl error:&error]; 

Ich bin auf dem iOS9-Simulator ausgeführt. Das riecht nach einem Käfer. Ich werde ein Radar einreichen.

0

Ich finde es gerade aus etwas sehr wichtig, wenn Sie NSFileManager verwenden. Sie müssen auf App Sandboxing achten.

let documentDirectory = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, .UserDomainMask, true)[0] 

den Pfad Dokumentenverzeichnis Ihrer App Sandbox Diese Zeile zurück. Wenn Sie eine Datei mit FileManager in Ihrem Dokumentverzeichnis erstellen (z. B.), speichern Sie nicht den vollständigen Dateipfad, sondern nur den Pfad aus dem aktuellen Dokumentverzeichnis.

Sie können den vollständigen Pfad Ihrer erstellten Datei wiederherstellen.

Hoffen (nach 5 Jahren) Hilfe über Entwickler ;-)

Verwandte Themen