当在我的应用程序中调用处理已打开文件(来自其他应用程序)的App Delegate方法时,它传递给我的应用程序的URL是nil
...或者至少是NSFileManager告诉我的那个,因为该文件确实存在于它指定的位置。
为什么NSFileManager
告诉我应用文档收件箱中文件的文件URL不存在?以下是我处理网址的方式:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
if (![[NSFileManager defaultManager] fileExistsAtPath:[url absoluteString]]) {
NSLog(@"File does not exist at path: %@", [url absoluteString]);
} else {
...
}
}
我一直试图解决这个问题,但是我想不出为什么这里的url
参数会注册为不存在的原因。这可能非常简单。也许absoluteString
的事情正在绊倒NSFileManager?
有什么想法吗?我一直在搜索和搜索,但什么都没找到 - 而且什么也没想到。
答案 0 :(得分:1)
将(文件)URL转换为路径的正确方法是path
,而不是absoluteString
if (![[NSFileManager defaultManager] fileExistsAtPath:[url path]]) {
...
:
-[NSURL path]
来自isFileURL
的文档:
另一方面,如果此URL对象包含文件URL(由
absoluteString
确定), 该方法的返回值适合输入到方法中 NSFileManager或NSPathUtilities。
{{1}}返回一个URL字符串,如“file:/// path / to / file”。
答案 1 :(得分:1)
这里的第一个错误是你正在使用-[NSURL absoluteString]
。您想要path
。
然而,另一个问题甚至可能是测试文件是否存在。这很少有用,您应该尝试对文件执行某些操作,处理发生的任何故障。
如果您真的做必须测试它的存在,请使用更现代的-[NSURL checkResourceIsReachableAndReturnError:]
。
答案 2 :(得分:0)
您应该在使用NSFileManager前检查网址:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
if (url && [url isFileURL])
{
if (![[NSFileManager defaultManager] fileExistsAtPath:[url absoluteString]]) {
NSLog(@"File does not exist at path: %@", [url absoluteString]);
}
else
{
...
}
}
}