web-dev-qa-db-fra.com

Obtention de références / chemins de fichiers groupés au lancement de l'application

Supposons que j'ai un ensemble arbitraire de fichiers inclus dans le bundle principal des applications. Je voudrais récupérer les URL des fichiers pour ceux au lancement et les stocker quelque part. Est-ce possible en utilisant NSFileManager? La documentation n'est pas claire à cet égard.

Remarque: je n'ai besoin que des URL de fichier, je n'ai pas besoin d'accéder aux fichiers réels.

29

Vous pouvez obtenir l'URL d'un fichier dans le bundle principal en utilisant

NSString *path = [[NSBundle mainBundle] pathForResource:@"SomeFile" ofType:@"jpeg"];
NSURL *url = [NSURL fileURLWithPath:path];

Vous pouvez écrire cette URL dans, par exemple, un fichier de liste de propriétés dans le répertoire Documents:

NSString *docsDir = [NSSearchForDirectoriesInDomains(NSDocumentsDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *plistPath = [docsDir stringByAppendingPathComponent:@"Files.plist"];
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[url absoluteString] forKey:@"SomeFile.jpeg"];
[dict writeToFile:plistPath atomically:YES];

Si vous ne connaissez pas les noms des fichiers et que vous souhaitez simplement répertorier tous les fichiers du bundle, utilisez

NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[[NSBundle mainBundle] bundlePath] error:NULL];
for (NSString *fileName in files) {
    NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:nil];
    NSURL *url = [NSURL fileURLWithPath:path];
    // do something with `url`
}
66
user529758

Ou en Swift 4:

        let url = Bundle.main.url(forResource: "FileName", withExtension: ".xyz")
6
Bersaelor

Oui, vous obtiendriez leur chemin:

NSString *path = [NSBundle mainBundle] pathForResource:@"file1" ofType:@"png"];
NSURL *fileURL = [NSURL fileURLWithPath:path]

// save it as any other object or in a dictionary:

[myMutableDictionary setObject:fileURL forKey:@"file1.png"];

EDIT: pour obtenir la liste complète des fichiers, utilisez NSFileManager, obtenez le chemin d'accès au bundle lui-même, puis parcourez chaque répertoire en obtenant les fichiers, en créant des URL et en les enregistrant quelque part. Il y a des tonnes de code sur SO comment parcourir un répertoire pour ce faire. [Vous devriez mettre à jour votre question pour être plus précis sur ce que vous voulez, ce n'était pas clair du tout à l'origine])

2
David H

Il existe une API sur NSBundle ( documentation ) disponible sur 10.6 ou iOS 4 pour obtenir directement un NSURL, plutôt que de passer un chemin vers le NSURL constructeur:

- (NSURL *)URLForResource:(NSString *)name withExtension:(NSString *)ext;

Il a également des variantes qui prennent un subdirectory et localizationName, le même que son -pathForResource: équivalents.

1
Dov