Obtenir une liste de fichiers dans le dossier Resources - iOS


85

Disons que j'ai un dossier dans mon dossier "Ressources" de mon application iPhone appelé "Documents".

Existe-t-il un moyen d'obtenir un tableau ou un type de liste de tous les fichiers inclus dans ce dossier au moment de l'exécution?

Donc, dans le code, cela ressemblerait à:

NSMutableArray *myFiles = [...get a list of files in Resources/Documents...];

Est-ce possible?

Réponses:


139

Vous pouvez obtenir le chemin du Resourcesrépertoire comme ceci,

NSString * resourcePath = [[NSBundle mainBundle] resourcePath];

Ensuite, ajoutez le Documentsau chemin,

NSString * documentsPath = [resourcePath stringByAppendingPathComponent:@"Documents"];

Ensuite, vous pouvez utiliser l'une des API de liste de répertoires de NSFileManager.

NSError * error;
NSArray * directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsPath error:&error];

Remarque : lorsque vous ajoutez un dossier source dans l'ensemble, assurez-vous de sélectionner l'option "Créer des références de dossier pour toute option de dossier ajouté lors de la copie"


2
intéressant. sans l'ajout, cela a fonctionné et a tout trouvé (y compris le dossier Documents). mais avec cet ajout, le tableau "directoryOfContents" est nul
— CodeGuy

oh attendez, "Documents" est un "Groupe" pas un dossier. hm. comment ajouter un dossier dans mon dossier de ressources?
— CodeGuy

Vous pouvez Drag & Dropcréer un dossier sur le projet et le contenu sera copié. Ou Ajoutez une Copy Filesphase de construction et spécifiez le répertoire à copier.
— Deepak Danduprolu

ok, je l'ai fait glisser dedans. mais il pense toujours que le répertoire est vide. hm.
— CodeGuy

4
Avez-vous sélectionné une Create folder references for any added foldersoption lors de la copie?
— Deepak Danduprolu

27

Rapide

Mis à jour pour Swift 3

let docsPath = Bundle.main.resourcePath! + "/Resources"
let fileManager = FileManager.default

do {
    let docsArray = try fileManager.contentsOfDirectory(atPath: docsPath)
} catch {
    print(error)
}

Lectures complémentaires:


4
Error Domain = NSCocoaErrorDomain Code = 260 "Le dossier" Resources "n'existe pas." UserInfo = {NSFilePath = / var / containers / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources, NSUserStringVariant = (Dossier), NSUnderlyingError = 0x1c4450140 {Error Domain = 0x1c4450140 {Error Domain = "NSPomain Code No" fichier ou répertoire "}}
— Argus

18

Vous pouvez également essayer ce code:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSError * error;
NSArray * directoryContents =  [[NSFileManager defaultManager]
                      contentsOfDirectoryAtPath:documentsDirectory error:&error];

NSLog(@"directoryContents ====== %@",directoryContents);

vous allouez un tableau dans directoryContents qui est immédiatement écrasé par un tableau renvoyé par contentsOfDir ...
— Joris Weimar

Ce que je voulais montrer était juste un tableau qui contiendrait le contenu du répertoire. Le tableau est là juste pour l'amour de l'exemple. Je l'ai légèrement modifié.
— neowinston

15

Version Swift:

    if let files = try? FileManager.default.contentsOfDirectory(atPath: Bundle.main.bundlePath ){
        for file in files {
            print(file)
        }
    }

7

Liste de tous les fichiers dans un répertoire

     NSFileManager *fileManager = [NSFileManager defaultManager];
     NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];
     NSArray *contents = [fileManager contentsOfDirectoryAtURL:bundleURL
                           includingPropertiesForKeys:@[]
                                              options:NSDirectoryEnumerationSkipsHiddenFiles
                                                error:nil];

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pathExtension ENDSWITH '.png'"];
     for (NSString *path in [contents filteredArrayUsingPredicate:predicate]) {
        // Enumerate each .png file in directory
     }

Énumération récursive des fichiers dans un répertoire

      NSFileManager *fileManager = [NSFileManager defaultManager];
      NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];
      NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtURL:bundleURL
                                   includingPropertiesForKeys:@[NSURLNameKey, NSURLIsDirectoryKey]
                                                     options:NSDirectoryEnumerationSkipsHiddenFiles
                                                errorHandler:^BOOL(NSURL *url, NSError *error)
      {
         NSLog(@"[Error] %@ (%@)", error, url);
      }];

      NSMutableArray *mutableFileURLs = [NSMutableArray array];
      for (NSURL *fileURL in enumerator) {
      NSString *filename;
      [fileURL getResourceValue:&filename forKey:NSURLNameKey error:nil];

      NSNumber *isDirectory;
      [fileURL getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:nil];

       // Skip directories with '_' prefix, for example
      if ([filename hasPrefix:@"_"] && [isDirectory boolValue]) {
         [enumerator skipDescendants];
         continue;
       }

      if (![isDirectory boolValue]) {
          [mutableFileURLs addObject:fileURL];
       }
     }

Pour en savoir plus sur NSFileManager, cliquez ici


3
Cela ne fonctionnera pas si l'extenison a le «.». En d'autres termes, cela fonctionnera: [NSPredicate predicateWithFormat: @ "pathExtension ENDSWITH 'png'"];
— Liangjun

4

Swift 3 (et renvoyer les URL)

let url = Bundle.main.resourceURL!
    do {
        let urls = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys:[], options: FileManager.DirectoryEnumerationOptions.skipsHiddenFiles)
    } catch {
        print(error)
    }

3

Swift 4:

Si vous avez à faire avec des sous-répertoires "Relative to project" (dossiers bleus), vous pouvez écrire:

func getAllPListFrom(_ subdir:String)->[URL]? {
    guard let fURL = Bundle.main.urls(forResourcesWithExtension: "plist", subdirectory: subdir) else { return nil }
    return fURL
}

Utilisation :

if let myURLs = getAllPListFrom("myPrivateFolder/Lists") {
   // your code..
}

Exactement ce que je cherchais. Merci !!
— rogerstone
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.