如何在iOS中以recursion方式获取所有资源path?

我的应用程序包中有一个“解压缩”的文件夹。 我需要获取txttypes的所有文件的资源path。 我一直在使用这个,

NSArray *filePaths = [NSBundle pathsForResourcesOfType:@"txt" inDirectory:[[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/unzipped"]]; 

但是它只能获取第一个目录中的文件。 有没有这个我刚刚失踪的地方的recursion版本?

我使用@rekle发布的代码作为起点。 诀窍是使用NSDirectoryEnumerator,这将recursion执行此操作。 这是我写的function,以防万一需要。

 - (NSArray *)recursivePathsForResourcesOfType:(NSString *)type inDirectory:(NSString *)directoryPath{ NSMutableArray *filePaths = [[NSMutableArray alloc] init]; // Enumerators are recursive NSDirectoryEnumerator *enumerator = [[[NSFileManager defaultManager] enumeratorAtPath:directoryPath] retain]; NSString *filePath; while ((filePath = [enumerator nextObject]) != nil){ // If we have the right type of file, add it to the list // Make sure to prepend the directory path if([[filePath pathExtension] isEqualToString:type]){ [filePaths addObject:[directoryPath stringByAppendingPathComponent:filePath]]; } } [enumerator release]; return [filePaths autorelease]; } 

Swift,使用NSURL

 func recursivePathsForResources(type type: String) -> [NSURL] { // Enumerators are recursive let enumerator = NSFileManager.defaultManager().enumeratorAtPath(bundlePath) var filePaths = [NSURL]() while let filePath = enumerator?.nextObject() as? String { if NSURL(fileURLWithPath: filePath).pathExtension == type { filePaths.append(bundleURL.URLByAppendingPathComponent(filePath)) } } return filePaths } 

只需更新此方法即可允许任何文件types(nil)并提供正确的path格式

 - (NSArray *)recursivePathsForResourcesOfType:(NSString *)type inDirectory:(NSString *)directoryPath{ NSMutableArray *filePaths = [[NSMutableArray alloc] init]; NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtPath:directoryPath]; NSString *filePath; while ((filePath = [enumerator nextObject]) != nil){ if (!type || [[filePath pathExtension] isEqualToString:type]){ [filePaths addObject:[directoryPath stringByAppendingPathComponent:filePath]]; } } return filePaths; } 

尝试这样的事情:

 NSString * bundlePath = [[NSBundle mainBundle] bundlePath];
 NSError * error = nil;
 NSArray * files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:bundlePath error:&error];

'files'将是包含该path中所有文件名的string数组。

Swift 3.1版本的来自smokinggoyster的答案

 func recursivePathsForResources(type: String, in directoryPath: String) -> [String] { // Enumerators are recursive let enumerator = FileManager.default.enumerator(atPath: directoryPath) var filePaths: [String] = [] while let filePath = enumerator?.nextObject() as? String { if URL(fileURLWithPath: filePath).pathExtension == type { filePaths.append(directoryPath.byAppending(pathComponent: filePath)) } } return filePaths } 

在复制之前考虑一下创build符号链接。 您可以创build一个符号链接到许多项目的文件夹。 它在大多数情况下都可以工作。

您将免费创build另一个线程,等待操作结束等。