Supprimer le fichier spécifié du répertoire de documents

111

Je souhaite supprimer une image du répertoire de documents de mon application. Le code que j'ai écrit pour supprimer l'image est:

 -(void)removeImage:(NSString *)fileName
{
    fileManager = [NSFileManager defaultManager];
    paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    documentsPath = [paths objectAtIndex:0];
    filePath = [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", fileName]];
    [fileManager removeItemAtPath:filePath error:NULL];
    UIAlertView *removeSuccessFulAlert=[[UIAlertView alloc]initWithTitle:@"Congratulation:" message:@"Successfully removed" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil];
    [removeSuccessFulAlert show];
}

Son fonctionne partiellement. Ce code supprime le fichier du répertoire, mais lorsque je vérifie le contenu du répertoire, il affiche toujours le nom de l'image. Je veux supprimer complètement ce fichier du répertoire. Que dois-je changer dans le code pour faire de même? Merci


la source
4
Il génère probablement une erreur que vous avez ignorée, ajoutez l'instance NSError et vérifiez-la après removeItemAtPath
Dmitry Shevchenko
1
use - (BOOL) fileExistsAtPath: chemin (NSString *); pour vérifier si l'image existe, si elle renvoie OUI, cela signifie que votre suppression a échoué
Guo Luchuan
Je viens de le tester et il est définitivement supprimé et la suppression est reflétée contentsOfDirectoryAtPath(c'est- à -dire aucune mise en cache de répertoire impliquée ici). Vous devez donc avoir une simple erreur de jeu qui devrait apparaître lorsque vous regardez le NSErrorcontenu.
Rob

Réponses:

238

J'ai vérifié votre code. Ça marche pour moi. Vérifiez toute erreur que vous obtenez en utilisant le code modifié ci-dessous

- (void)removeImage:(NSString *)filename
{
  NSFileManager *fileManager = [NSFileManager defaultManager];
  NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

  NSString *filePath = [documentsPath stringByAppendingPathComponent:filename];
  NSError *error;
  BOOL success = [fileManager removeItemAtPath:filePath error:&error];
  if (success) {
      UIAlertView *removedSuccessFullyAlert = [[UIAlertView alloc] initWithTitle:@"Congratulations:" message:@"Successfully removed" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil];
      [removedSuccessFullyAlert show];
  }
  else
  {
      NSLog(@"Could not delete file -:%@ ",[error localizedDescription]);
  }
}
Anil Varghese
la source
Je peux créer un fichier dans le répertoire Document, mais j'obtiens toujours une erreur lorsque je tente de le supprimer. As tu des idées?
Vadim
Je l'ai résolu. Le problème était: j'ai créé un nouveau fichier sans aucun attribut, et si je comprends bien, il a donné un attribut par défaut NSFileImmutable YES. Ou quelque chose comme ça. Désolé, impossible d'afficher les sources pour le moment. Mais le problème était trivial.
Vadim
Le fichier de vérification existe-t-il ou n'est-il pas nécessaire?
Sangram Shivankar
il supprime le fichier du répertoire mais il montre toujours l'image sur les photos du simulateur
Sagar koyani
55

Swift 3.0:

func removeImage(itemName:String, fileExtension: String) {
  let fileManager = FileManager.default
  let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
  let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
  let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
  guard let dirPath = paths.first else {
      return
  }  
  let filePath = "\(dirPath)/\(itemName).\(fileExtension)"
  do {
    try fileManager.removeItem(atPath: filePath)
  } catch let error as NSError {
    print(error.debugDescription)
  }}

Grâce à @Anil Varghese, j'ai écrit un code très similaire dans swift 2.0:

static func removeImage(itemName:String, fileExtension: String) {
  let fileManager = NSFileManager.defaultManager()
  let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory
  let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask
  let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
  guard let dirPath = paths.first else {
    return
  }
  let filePath = "\(dirPath)/\(itemName).\(fileExtension)"
  do {
    try fileManager.removeItemAtPath(filePath)
  } catch let error as NSError {
    print(error.debugDescription)
  }
}
Roman Barzyczak
la source
Pourquoi rendre la fonction statique?
CalZone
C'est à vous. Ce n'est pas nécessaire
Roman Barzyczak
Existe-t-il un moyen de vérifier si le fichier existe toujours avant / après l'appel de la fonction pour s'assurer qu'il a été supprimé?
luke
1
oui sûr: laissez fileManager = FileManager.default if fileManager.fileExists (atPath: filePath!) {print ("FILE AVAILABLE")} else {print ("FILE NOT AVAILABLE")}
Roman Barzyczak
11

Swift 2.0:

func removeOldFileIfExist() {
    let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    if paths.count > 0 {
        let dirPath = paths[0]
        let fileName = "someFileName"
        let filePath = NSString(format:"%@/%@.png", dirPath, fileName) as String
        if NSFileManager.defaultManager().fileExistsAtPath(filePath) {
            do {
                try NSFileManager.defaultManager().removeItemAtPath(filePath)
                print("old image has been removed")
            } catch {
                print("an error during a removing")
            }
        }
    }
}
FreeGor
la source
8

Dans Swift à la fois 3 et 4

 func removeImageLocalPath(localPathName:String) {
            let filemanager = FileManager.default
            let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true)[0] as NSString
            let destinationPath = documentsPath.appendingPathComponent(localPathName)
 do {
        try filemanager.removeItem(atPath: destinationPath)
        print("Local path removed successfully")
    } catch let error as NSError {
        print("------Error",error.debugDescription)
    }
    }

ou Cette méthode peut supprimer tous les fichiers locaux

func deletingLocalCacheAttachments(){
        let fileManager = FileManager.default
        let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
        do {
            let fileURLs = try fileManager.contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: nil)
            if fileURLs.count > 0{
                for fileURL in fileURLs {
                    try fileManager.removeItem(at: fileURL)
                }
            }
        } catch {
            print("Error while enumerating files \(documentsURL.path): \(error.localizedDescription)")
        }
    }
Sai kumar Reddy
la source
2
Ajoutez ce qui suit dans la dernière ligne à la place pour essayer directement. do {try filemanager.removeItem (atPath: destinationPath) print ("Deleted")} catch {print ("Not Deleted")}
Abhirajsinh Thakore
5

Au lieu d'avoir l'erreur définie sur NULL, réglez-la sur

NSError *error;
[fileManager removeItemAtPath:filePath error:&error];
if (error){
NSLog(@"%@", error);
}

cela vous dira s'il supprime réellement le fichier

Chris Loonam
la source
3

Je veux supprimer ma base de données sqlite du répertoire de documents.Je supprime la base de données sqlite avec succès par la réponse ci-dessous

NSString *strFileName = @"sqlite";
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSArray *contents = [fileManager contentsOfDirectoryAtPath:documentsDirectory error:NULL];
NSEnumerator *enumerator = [contents objectEnumerator];
NSString *filename;
while ((filename = [enumerator nextObject])) {
    NSLog(@"The file name is - %@",[filename pathExtension]);
    if ([[filename pathExtension] isEqualToString:strFileName]) {
       [fileManager removeItemAtPath:[documentsDirectory stringByAppendingPathComponent:filename] error:NULL];
        NSLog(@"The sqlite is deleted successfully");
    }
}
user3182143
la source
2
    NSError *error;
    [[NSFileManager defaultManager] removeItemAtPath:new_file_path_str error:&error];
    if (error){
        NSLog(@"%@", error);
    }
Alex Spencer
la source
1

Version FreeGor convertie en Swift 3.0

 func removeOldFileIfExist() {
    let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
    if paths.count > 0 {
        let dirPath = paths[0]
        let fileName = "filename.jpg"
        let filePath = NSString(format:"%@/%@", dirPath, fileName) as String
        if FileManager.default.fileExists(atPath: filePath) {
            do {
                try FileManager.default.removeItem(atPath: filePath)
                print("User photo has been removed")
            } catch {
                print("an error during a removing")
            }
        }
    }
}
Andrea Leganza
la source
0

Vous pouvez double protéger la suppression de votre fichier avec NSFileManager.defaultManager (). IsDeletableFileAtPath (PathName) À partir de maintenant, vous DEVEZ utiliser do {} catch {} car les anciennes méthodes d'erreur ne fonctionnent plus. isDeletableFileAtPath () n'est pas un "throws" (ie "public func removeItemAtPath (path: String) throws") donc il n'a pas besoin du do ... catch

let killFile = NSFileManager.defaultManager()

            if (killFile.isDeletableFileAtPath(PathName)){


                do {
                  try killFile.removeItemAtPath(arrayDictionaryFilePath)
                }
                catch let error as NSError {
                    error.description
                }
            }
Homme de montagne
la source
0

Si vous êtes intéressé par l'API moderne, en évitant NSSearchPath et en filtrant les fichiers dans le répertoire des documents, avant la suppression, vous pouvez faire comme:

let fileManager = FileManager.default
let keys: [URLResourceKey] = [.nameKey, .isDirectoryKey]
let options: FileManager.DirectoryEnumerationOptions = [.skipsHiddenFiles, .skipsPackageDescendants]
guard let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask).last,
      let fileEnumerator = fileManager.enumerator(at: documentsUrl,
                                                  includingPropertiesForKeys: keys,
                                                  options: options) else { return }

let urls: [URL] = fileEnumerator.flatMap { $0 as? URL }
                                .filter { $0.pathExtension == "exe" }
for url in urls {
   do {
      try fileManager.removeItem(at: url)
   } catch {
      assertionFailure("\(error)")
   }
}
Azon
la source