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.