在资源文件夹中获取文件列表-iOS


85

假设我的iPhone应用程序的“资源”文件夹中有一个名为“文档”的文件夹。

有没有一种方法可以在运行时获取该文件夹中包含的所有文件的数组或某种类型的列表?

因此,在代码中,它看起来像:

NSMutableArray *myFiles = [...get a list of files in Resources/Documents...];

这可能吗?

Answers:


139

您可以这样获取Resources目录的路径,

NSString * resourcePath = [[NSBundle mainBundle] resourcePath];

然后将追加Documents到路径,

NSString * documentsPath = [resourcePath stringByAppendingPathComponent:@"Documents"];

然后,您可以使用的任何目录列表API NSFileManager

NSError * error;
NSArray * directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsPath error:&error];

注意:将源文件夹添加到捆绑包中时,请确保选择“复制时为任何添加的文件夹创建文件夹引用选项”


2
有趣。没有附加它就可以工作并找到了所有内容(包括Documents文件夹)。但是带有该追加,“ directoryOfContents”数组为空
CodeGuy 2011年

哦,等等,“文档”是“组”而不是文件夹。嗯。如何在资源文件夹中添加文件夹?
CodeGuy

您可以Drag & Drop在项目上放置一个文件夹,然后内容将被复制。添加一个Copy Files构建阶段并指定要在其中复制的目录。
Deepak Danduprolu 2011年

好的,我将其拖入。但是它仍然认为目录为空。嗯。
CodeGuy

4
Create folder references for any added folders复制时是否选择了选项?
Deepak Danduprolu 2011年

27

迅速

为Swift 3更新

let docsPath = Bundle.main.resourcePath! + "/Resources"
let fileManager = FileManager.default

do {
    let docsArray = try fileManager.contentsOfDirectory(atPath: docsPath)
} catch {
    print(error)
}

进一步阅读:


4
错误域= NSCocoaErrorDomain代码= 260“文件夹“资源”不存在。” UserInfo = {NSFilePath = / var / containers / Bundle / Application / A367E139-1845-4FD6-9D7F-FCC7A64F0408 / Robomed.app / Resources,NSUserStringVariant =(Folder),NSUnderlyingError = 0x1c4450140 {Error Domain = NSPOSIXErrorDomain Code = 2“文件或目录”}}
阿格斯

18

您也可以尝试以下代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSError * error;
NSArray * directoryContents =  [[NSFileManager defaultManager]
                      contentsOfDirectoryAtPath:documentsDirectory error:&error];

NSLog(@"directoryContents ====== %@",directoryContents);

您在directoryContents中分配了一个数组,该数组立即被数组覆盖,由contentsOfDir返回...
Joris Weimar 2014年

我要显示的只是一个包含目录内容的数组。举例来说,数组就在那里。我已经对其进行了稍微的编辑。
neowinston 2014年

15

迅捷版:

    if let files = try? FileManager.default.contentsOfDirectory(atPath: Bundle.main.bundlePath ){
        for file in files {
            print(file)
        }
    }

7

列出目录中的所有文件

     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
     }

递归枚举目录中的文件

      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];
       }
     }

有关NSFileManager的更多信息,请点击这里


3
如果扩展名带有“。”,则它将不起作用。换句话说,这将起作用:[NSPredicate predicateWithFormat:@“ pathExtension ENDSWITH'png'”];
梁军2014年

4

Swift 3(以及返回的URL)

let url = Bundle.main.resourceURL!
    do {
        let urls = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys:[], options: FileManager.DirectoryEnumerationOptions.skipsHiddenFiles)
    } catch {
        print(error)
    }

3

斯威夫特4:

如果与子目录“相对于项目”(蓝色文件夹)有关,则可以编写:

func getAllPListFrom(_ subdir:String)->[URL]? {
    guard let fURL = Bundle.main.urls(forResourcesWithExtension: "plist", subdirectory: subdir) else { return nil }
    return fURL
}

用法

if let myURLs = getAllPListFrom("myPrivateFolder/Lists") {
   // your code..
}

我正在寻找什么。谢谢 !!
罗杰斯通
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.