2011-08-15 20 views
6

Chcę usunąć programowo cały mój plik plist z systemu plików. Jak mogę to zrobić?Jak mogę usunąć plist programowo?

ten sposób piszę plist:

+ (void)writeObjectToPList:(id)myData { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"mobile-watchlist.plist"]; 
    [myData writeToFile:path atomically:YES]; 
} 

Odpowiedz

16

NSFileManager będzie można usunąć plik, używając removeItemAtPath:error:

+ (void)deletePList { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"mobile-watchlist.plist"]; 

    NSError *error; 
    if(![[NSFileManager defaultManager] removeItemAtPath:path error:&error]) 
    { 
     //TODO: Handle/Log error 
    } 
} 
3

Oto jak to zrobić.

NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:@"mobile-watchlist.plist"]; 
    [fileManager removeItemAtPath: fullPath error:NULL]; 
+3

Nie chciałbyś mieć błędu o wartości null, chciałbyś zrobić coś w rodzaju tego, co robi Joe, gdy zajmuje się błędem, jeśli istnieje. –

0

W ten sposób udało mi się usunąć wszystkie stare listy właściwości oprócz bieżącej miałem. Jest w Swift 3:

func removeOldPlistFiles() { 

    let fileManager = FileManager.default 

    // get directory with your current plist for comparison later 
    let directory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] 
    let destPath = (dir as NSString).appendingPathComponent("YourCurrentPlistName.plist") 

    // Get the documents directory url 
    let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! 

    do { 

     // Get the documents directory contents urls (including subfolders urls) 
     let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsUrl, includingPropertiesForKeys: nil, options: []) 

     // filter the directory contents and get file names 
     let plistFiles = directoryContents.filter{ $0.pathExtension == "plist" } 
     let plistFileNames = plistFiles.map{ $0.deletingPathExtension().lastPathComponent } 

     for nameFile in plistFileNames { 

      let dir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] 
      let item = (dir as NSString).appendingPathComponent("\(nameFile).plist") 

      if item != self.destPath! { 

       do { 

        try fileManager.removeItem(atPath: item) 
       } 

       catch let error as NSError { 

        print("FimeManager Remove Item error: \(error.debugDescription)") 
       } 
      } 
     } 

    } catch let error as NSError { 

     print("Directory Contents error: \(error.localizedDescription)") 
    } 
} 

Przypuszczam, że kod może być lepiej, mimo że jest funkcjonalny. Jeśli ktokolwiek ma jakieś spostrzeżenia, proszę udostępnij.

0

Spowoduje to usunięcie wszystkich plików w folderze dokumentu. Jeśli aplikacja przechowuje pliki, których nie chcesz usuwać w tym katalogu, dodaj kod, aby upewnić się, że pliki te nie zostaną usunięte.

NSError *errorGettingAllBanners = nil; 
for (NSString *file in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] error:&errorGettingAllBanners]) { 
    NSError *errorDeletingAllBanners = nil; 
    [[NSFileManager defaultManager] removeItemAtPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:file] error:&errorDeletingAllBanners]; 
}