fileExistsAtPath 和 checkResourceIsReachableAndReturnError 都不起作用
Posted
技术标签:
【中文标题】fileExistsAtPath 和 checkResourceIsReachableAndReturnError 都不起作用【英文标题】:fileExistsAtPath and checkResourceIsReachableAndReturnError both didn't work 【发布时间】:2014-04-29 18:24:43 【问题描述】:fileExistsAtPath
和 checkResourceIsReachableAndReturnError
都返回 NO
即使文件存在于 server URL
我在(本地)服务器中有一个文件
http://10.0.0.15/images/hibrise.png
NSURL *url=[NSURL URLWithString:@"http://10.0.0.15/images/hibrise.png"];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:[url path]];
NSLog(fileExists ? @"Yes" : @"No");
我已经检查了文件权限也很好。 当我在浏览器中输入相同的网址时,它会显示图像
'fileExistsAtPath' 该方法用于检查内部文件系统中的文件可用性
checkResourceIsReachableAndReturnError
这也仅适用于内部 ios 文件系统 This method is currently applicable only to URLs for file system resources. For other URL types, NO is returned
Apple 对 fileExistsAtPath
也这么说
使用 URL 检查文件可用性的最佳方法是什么
【问题讨论】:
最好将 url 保存到 NSCache 并检查它是否在 NScache 中找到。因为你不能用 NSFileManager 来检查文件 url 【参考方案1】:NSFileManager
用于内部 iOS 文件系统。您无法使用NSFileMAnager
检查远程文件是否存在。
改用NSURL
类的checkResourceIsReachableAndReturnError
方法。
【讨论】:
感谢您的回复,但这也仅适用于内部 iOS 文件系统This method is currently applicable only to URLs for file system resources. For other URL types, NO is returned
【参考方案2】:
您无法使用NSFileManager
类检查设备以外位置中的文件。
你需要使用的是NSURL方法- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error
NSURL *url=[NSURL URLWithString:@"http://10.0.0.15/images/hibrise.png"];
NSError *err;
BOOL fileExists = [url checkResourceIsReachableAndReturnError:&err];
如果有错误,它会被传递给 NSError 指针,所以你也应该检查一下
正确的答案是实际执行 HTTP HEAD 请求并检查 404 错误:
BOOL fileExists;
NSURL *url=[NSURL URLWithString:@"http://10.0.0.15/images/hibrise.png"];
NSMutableURLRequest *headRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30.0f];
[headRequest setHTTPMethod:@"HEAD"];
[NSURLConnection sendAsynchronousRequest:headRequest
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
fileExists = ([(NSHTTPURLResponse *)response statusCode]!=404)
];
【讨论】:
这对这个问题无能为力。来自苹果的文档:This method is currently applicable only to URLs for file system resources. For other URL types, NO is returned
谢谢!更新的答案是我需要的。在我的情况下,我在 AWS S3 文件失败时收到 403 状态代码(不是 404)。我将检查更改为 statusCode == 200。以上是关于fileExistsAtPath 和 checkResourceIsReachableAndReturnError 都不起作用的主要内容,如果未能解决你的问题,请参考以下文章
NSFileManager.defaultManager().fileExistsAtPath 返回 false 而不是 true
NSFileManager.contentsOfDirectoryAtURL 返回的文件根据 NSFileManager.fileExistsAtPath 不存在?
当路径正确时,为啥 NSFIleManager -fileExistsAtPath 找不到现有文件?
fileExistsAtPath判断是否有文件一直返回NO的bug