检查包中是不是存在文件

Posted

技术标签:

【中文标题】检查包中是不是存在文件【英文标题】:Checking the presence of a file in the bundle检查包中是否存在文件 【发布时间】:2011-04-04 23:31:44 【问题描述】:

我们如何在获取文件之前检查文件是否存在于应用程序中加载的外部包中?

【问题讨论】:

请记住,ios 应用程序不能有多个捆绑包。所以,没有“外部包”,只有主包。 【参考方案1】:

要检查包中是否存在文件,请使用NSBundle 类。

NSString *path = [[NSBundle mainBundle] 
                            pathForResource:@"somefileinbundle" 
                            ofType:@"png"];
if (!path)
   NSLog(@"Unable to find file in bundle");

话虽如此,但在尝试加载文件之前先检查文件是否存在通常是个坏主意。根据NSFileManager fileExistsAtPath:上的苹果文档@

不建议尝试基于文件系统的当前状态或文件系统上的特定文件来判断行为。在文件系统竞争条件的情况下,这样做可能会导致奇怪的行为。 尝试操作(例如加载文件或创建目录)、检查错误并优雅地处理任何错误比尝试提前确定操作是否成功要好得多。 有关文件系统竞争条件的更多信息,请参阅安全编码指南中的“避免竞争条件和不安全的文件操作”

【讨论】:

您对pathForResource:ofType 的使用对我来说似乎有点奇怪——您为什么要手动附加类型?我建议改用这个:NSString *path = [[NSBundle mainBundle] pathForResource:@"somefileinbundle" ofType:@"png"]; 这真的没有区别——任何一种方式都将完全一样。我开始使用我的方法是因为我经常会在项目中途更改资源类型——例如从 png 到 jpg - 取决于哪个更适合图像类型。仅搜索和替换整个文件名而不是搜索名称、替换它然后手动替换扩展名要容易得多。没什么大不了的,但在几个项目中却是一件令人头疼的事情。【参考方案2】:

如果您只想知道它是否存在以便决定是否加载它,我会尝试加载它并检查返回的对象是否为 nil。如果是,您知道它在捆绑包中不存在。

【讨论】:

以上是关于检查包中是不是存在文件的主要内容,如果未能解决你的问题,请参考以下文章

在R中,如何检查卸载包中是否存在函数?

VB检查多个文件是不是存在

C语言,判断一个文件是不是存在

在VC里如何检查一个文件是不是存在

检查文件目录中是不是存在文件

Shell 脚本检查 dir 目录是不是存在然后更改路径,如果不存在则使用该名称创建 dir 并检查文件名不存在