Parcourir des fichiers dans un dossier avec des dossiers nesteds – Cocoa

Je dois accéder à tous les fichiers d’un dossier, y compris ceux existant dans des dossiers nesteds. Un exemple de dossier peut ressembler à ceci.

animals/ -k.txt -d.jpg cat/ -r.txt -z.jpg tiger/ -a.jpg -p.pdf dog/ -n.txt -f.jpg -p.pdf 

Dites que je voulais exécuter un processus sur chaque fichier dans “animals” qui n’est pas un dossier. Quelle serait la meilleure façon de parcourir le dossier “animals” et tous ses sous-dossiers pour accéder à chaque fichier?

Merci.

Utilisez NSDirectoryEnumerator pour énumérer récursivement des fichiers et des répertoires sous le répertoire souhaité, et demandez-lui de vous indiquer s’il s’agit d’un fichier ou d’un répertoire. Ce qui suit est basé sur l’exemple répertorié dans la documentation de -[NSFileManager enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:] :

 NSFileManager *fileManager = [NSFileManager defaultManager]; NSURL *directoryURL = … // URL pointing to the directory you want to browse NSArray *keys = [NSArray arrayWithObject:NSURLIsDirectoryKey]; NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtURL:directoryURL includingPropertiesForKeys:keys options:0 errorHandler:^(NSURL *url, NSError *error) { // Handle the error. // Return YES if the enumeration should continue after the error. return YES; }]; for (NSURL *url in enumerator) { NSError *error; NSNumber *isDirectory = nil; if (! [url getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:&error]) { // handle error } else if (! [isDirectory boolValue]) { // No error and it's not a directory; do something with the file } } 

Peut-être que vous pouvez utiliser quelque chose comme ceci:

 +(void)openEachFileAt:(NSSsortingng*)path { NSSsortingng* file; NSDirectoryEnumerator* enumerator = [[NSFileManager defaultManager] enumeratorAtPath:path]; while (file = [enumerator nextObject]) { // check if it's a directory BOOL isDirectory = NO; NSSsortingng* fullPath = [path ssortingngByAppendingPathComponent:file]; [[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory: &isDirectory]; if (!isDirectory) { // open your file (fullPath)… } else { [self openEachFileAt: fullPath]; } } } 

Voici une version rapide:

 func openEachFileAt(path: Ssortingng) { var file: Ssortingng var subs = NSFileManager.defaultManager().subpathsOfDirectoryAtPath(path, error: nil) as! [Ssortingng] var totalFiles = subs.count println(totalFiles) for sub in subs { if sub.rangeOfSsortingng(".DS_Store") != nil { //a DS_Store file } else if sub.rangeOfSsortingng(".xcassets") != nil { //a xcassets file } else if (sub as NSSsortingng).subssortingngWithRange(NSRange(location: 0, length: 4)) == ".git" { //a git file } else if sub.pathExtension == "swift" { //a swift file } else if sub.pathExtension == "m" { //a objc file } else if sub.pathExtension == "h" { //a header file } else { } var fullPath = path.ssortingngByAppendingPathComponent(sub) } } 

Ce code a fonctionné pour moi.

 NSMutableSsortingng *allHash; -(NSSsortingng*)getIterate:(NSSsortingng*)path { allHash = [NSMutableSsortingng ssortingngWithSsortingng:@""]; NSDirectoryEnumerator *de= [[NSFileManager defaultManager] enumeratorAtPath:path]; NSSsortingng *file; BOOL isDirectory; for(file in de) { //first check if it's a file NSSsortingng* fullPath = [NSSsortingng ssortingngWithFormat:@"%@/%@",path,file]; BOOL fileExistsAtPath = [[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDirectory]; NSLog(@"Check=>%d",fileExistsAtPath); if (!isDirectory) //its a file { //Do with filepath } else{ //it's a folder, so recurse [self enumerateFolder:fullPath]; } } return allHash; } -(void) enumerateFolder:(NSSsortingng*)fileName { NSDirectoryEnumerator *de= [[NSFileManager defaultManager] enumeratorAtPath:fileName]; NSSsortingng* file; BOOL isDirectory; for(file in de) { //first check if it's a file BOOL fileExistsAtPath = [[NSFileManager defaultManager] fileExistsAtPath:file isDirectory:&isDirectory]; if (fileExistsAtPath) { if (!isDirectory) //its a file { //Do with file } else{ //it's a folder, so recurse [self enumerateFolder:file]; } } else printf("\nenumeratefolder No file at path %s",[file UTF8Ssortingng]); } } 

Voici une solution utilisant -subpathsOfDirectoryAtPath:rootPath , avec les URL de fichier et les cloches et les sifflets de Objectability-C modernes.

 typedef void (^FileEnumerationBlock)(NSURL *_Nonnull fileURL); @interface NSFileManager (Extensions) - (void)enumerateWithRootDirectoryURL:(nonnull NSURL *)rootURL fileHandler:(FileEnumerationBlock _Nonnull)fileHandler error:(NSError *_Nullable *_Nullable)error; @end @implementation NSFileManager (Extensions) - (void)enumerateWithRootDirectoryURL:(NSURL *)rootURL fileHandler:(FileEnumerationBlock)fileHandler error:(NSError **)error { NSSsortingng *rootPath = rootURL.path; NSAssert(rootPath != nil, @"Invalid root URL %@ (nil path)", rootURL); NSArray *subs = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:rootPath error:error]; if (!subs) { return; } for (NSSsortingng *sub in subs) { fileHandler([rootURL URLByAppendingPathComponent:sub]); } } @end 

… Et pareil pour Swift:

 func enumerate(rootDirectoryURL rootURL: NSURL, fileHandler:(URL:NSURL)->Void) throws { guard let rootPath = rootURL.path else { preconditionFailure("Invalid root URL: \(rootURL)") } let subs = try NSFileManager.defaultManager().subpathsOfDirectoryAtPath(rootPath) for sub in subs { fileHandler(URL: rootURL.URLByAppendingPathComponent(sub)) } }