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 仅适用于绝对路径的主要内容,如果未能解决你的问题,请参考以下文章