fileExistsAtPath 和 checkResourceIsReachableAndReturnError 都不起作用

Posted

技术标签:

【中文标题】fileExistsAtPath 和 checkResourceIsReachableAndReturnError 都不起作用【英文标题】:fileExistsAtPath and checkResourceIsReachableAndReturnError both didn't work 【发布时间】:2014-04-29 18:24:43 【问题描述】:

fileExistsAtPathcheckResourceIsReachableAndReturnError 都返回 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

NSFileManager fileExistsAtPath 仅适用于绝对路径

无法将文件从包复制到 Documents 目录,为啥 fileExistsAtPath 返回错误?