在 Xcode 项目中组织文件并以编程方式获取文件夹列表

Posted

技术标签:

【中文标题】在 Xcode 项目中组织文件并以编程方式获取文件夹列表【英文标题】:Organize files in Xcode project and get the list of folders programmatically 【发布时间】:2015-04-27 17:25:10 【问题描述】:

我在资源导航器中的 Xcode 项目中有以下结构,我想在我的应用程序中反映出来。

也就是说,我想在“Books”文件夹中“扫描”并获取其中所有文件夹的NSArray。下一步是我想获取每个文件夹中所有文件的NSArray

到目前为止,我已经尝试使用任何连接到 NSBundle 的东西来获取文件夹列表,但这给了我错误的结果:

NSLog(@"bundle path is %@", [[NSBundle mainBundle] bundlePath]);

NSLog(@"resource path is %@", [[NSBundle mainBundle] resourcePath]);

这两种方法都不能以编程方式反映实际的文件夹结构。

有什么办法可以做到吗?

【问题讨论】:

Xcode 项目中的黄色(组)文件夹与文件在应用程序资源包中的存储方式完全没有关系。它们最终都位于 app bundle 的根目录中。 @rmaddy 如果我们将它们添加为文件夹引用,那么我们如何以编程方式访问结构和文件? 如果文件夹在 Xcode 中为蓝色(文件夹引用),则文件夹将出现在应用程序包中。只需使用NSFileManager 列出其内容。 首先在 mac weather 中检查物理目录,它们存储在与 xcode 中相同的结构中。 或者您可以尝试使用作为构建阶段添加的 shell 脚本复制捆绑资源,这可能有助于大量目录和文件,从而最大限度地减少手动组织工作。 【参考方案1】:

正如@rmaddy 所说,您的 Xcode 项目中实际上应该有 blue 文件夹,然后使用 NSDirectoryEnumerator 获取所有文件夹的完整列表。

这是我解决这个问题的方法:

NSURL *bundleURL = [[[NSBundle mainBundle] bundleURL] URLByAppendingPathComponent:@"Books" isDirectory:YES];

NSDirectoryEnumerator *dirEnumerator = [[NSFileManager defaultManager] enumeratorAtURL:bundleURL includingPropertiesForKeys:[NSArray arrayWithObjects:NSURLNameKey, NSURLIsDirectoryKey,nil] options:NSDirectoryEnumerationSkipsSubdirectoryDescendants  errorHandler:nil];

for (NSURL *theURL in dirEnumerator)

    // Retrieve the file name. From NSURLNameKey, cached during the enumeration.
    NSString *folderName;
    [theURL getResourceValue:&folderName forKey:NSURLNameKey error:NULL];

    // Retrieve whether a directory. From NSURLIsDirectoryKey cached during the enumeration.

    NSNumber *isDirectory;
    [theURL getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:NULL];

    if([isDirectory boolValue] == YES)
        NSLog(@"Name of dir is %@", folderName);
    

【讨论】:

以上是关于在 Xcode 项目中组织文件并以编程方式获取文件夹列表的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建SKView?

XCODE:UIView 背景没有出现在屏幕上,即使我在情节提要中设置了颜色并以编程方式

如何以编程方式为非 ARC xcode 项目中的特定文件启用 ARC?

下载多个文件并以编程方式在客户端压缩它们

以编程方式添加配置文件和证书

QT编程 获取当前工作目录下的文件列表,并以Tree的形式显示在界面上