NSFileManager fileExistsAtPath 仅适用于绝对路径

Posted

技术标签:

【中文标题】NSFileManager fileExistsAtPath 仅适用于绝对路径【英文标题】:NSFileManager fileExistsAtPath only works for absolute paths 【发布时间】:2012-10-26 15:35:26 【问题描述】:

我在一个文件夹中有一堆客户图片(名为 [code].png),但有些客户没有图片,所以我想显示一个占位符。

我正在检查图像 [code].png 是否存在,如果存在则显示该图像,否则显示占位符。但是,fileExistsAtPath 总是 返回 false,即使对于存在的图像也是如此。

NSFileManager *m    = [NSFileManager defaultManager];
NSString *imagePath = [NSString stringWithFormat:@"%@.png",code];
if ([m fileExistsAtPath:imagePath])
    self.detailViewController.imageFrame.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png",code]];
else
    self.detailViewController.imageFrame.image = [UIImage imageNamed:@"customer_large.png"];

这始终显示 customer_large。

但是,如果我将 imagePath 更改为图像的绝对路径并将显示的图像保留为相对文件名,则布尔值可以正常工作,并且显示的图像也可以工作。

这证明我正在检查的文件名确实存在,如图所示,但我显然在 fileExistsAtPath 方面遗漏了一些东西,因为当程序证明文件存在时它返回 false。

【问题讨论】:

在我的所有类/头文件等旁边的项目根目录中。它们的位置设置为“相对于组”,并且在该选项下方显示的文件名只是 [code].png 【参考方案1】:

由于图像存储在项目中,而不是文档目录中,我根本不会使用 NSFileManager。

改为使用 [UIImage imageNamed:@"IMAGE_FILENAME"] 并查看它是否返回 nil。如果是,则使用占位符。

这是一个代码sn-p:

UIImage *possibleImage = [UIImage imageNamed:@"IMAGE_FILENAME"];
if (possibleImage) 
   self.detailViewController.imageFrame.image = possibleImage;
 else 
   self.detailViewController.imageFrame.image = [UIImage imageNamed:@"customer_large.png"];

【讨论】:

这是一个简单的解决方案,比我当前的方法更简洁。一旦适当的时间过去,我会接受。【参考方案2】:

我假设您的文件存储在文档目录中?如果是这样,首先通过以下方式获取文档目录的路径:

NSString *destPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    destPath = [destPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",nameOfImage]];

检查该文件是否存在。希望这会有所帮助:D

【讨论】:

【参考方案3】:

就目前而言,imagePath 只是图像的名称。试试这个:

NSString *imagePath = [[NSBundle mainBundle] pathForResource:code ofType:@"png"];

【讨论】:

如果它在文档目录中,它会在项目本身中起作用。 @Matthew 这就是我发布的代码的用途... Mashups 解决方案是您访问文档目录的方式。 同意,但在 cmets 中,他正在项目目录中寻找东西。 @Matthew 没错,我的代码获取的是项目目录中的文件路径,而不是文档目录。

以上是关于NSFileManager fileExistsAtPath 仅适用于绝对路径的主要内容,如果未能解决你的问题,请参考以下文章

NSFilemanager 的使用

NSFileManager

NSFileManager的应用

教程 使用 NSFileManager 存储数据?

NSFileManager和NSFileHandle

NSFileManager - 创建一个只读文件