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?

CodeGuy
la source

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"

Deepak Danduprolu
la source
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:

Suragch
la source
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);
Neowinston
la source
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)
        }
    }
Matt Frear
la source
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

Govind
la source
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)
    }
Narco
la source
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..
}
Alessandro Ornano
la source
Exactement ce que je cherchais. Merci !!
rogerstone