ChatGPT解决这个技术问题 Extra ChatGPT

检查文件是否存在于 URL 而不是路径

如何检查文件是否存在于 URL(而不是路径)中,以便将预填充的默认存储设置到 iPhone 模拟器中:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Food.sqlite"];
/*
 Set up the store.
 For the sake of illustration, provide a pre-populated default store.
 */
NSFileManager *fileManager = [NSFileManager defaultManager];
// If the expected store doesn't exist, copy the default store.
if (![fileManager fileExistsAtPath:storePath]) {
    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Food" ofType:@"sqlite"];
    if (defaultStorePath) {
        [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
    }
}

我读过在最新版本的模板中,applicationDocumentsDirectory 方法返回一个 URL,因此我更改了代码以使用 NSURL 对象来表示文件路径。但在 [fileManager fileExistsAtPath:storePath],我需要将 fileExistsAtPath 更改为 fileExistsAtURL(显然它不存在)。

我检查了 NSFileManager 类参考,但没有找到适合我目的的合适任务。

请问有什么提示吗?


M
Mundi
if (![fileManager fileExistsAtPath:[storeURL path]]) 
...

documentation

如果此 URL 对象包含文件 URL(由 isFileURL 确定),则此方法的返回值适合输入到 NSFileManager 或 NSPathUtilities 的方法中。如果路径有尾部斜杠,则将其剥离。


使用 [url absoluteString] 时出错。不要使用绝对字符串。干杯。
谢谢你!!!! absoluteString 弄乱了我的文件。现在使用 .path 而不是 .absoluteString 一切都很好!
它应该。商店 URL 只是不同,因为它不在应用程序沙箱中,而是在共享容器文件夹中。这个实现细节被抽象出来了,所以它应该可以工作。
v
vadian

对于文件系统 URL,NSURL 本身具有检查 URL 可访问性的方法

NSError *error;
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Food.sqlite"];
if ([storeURL checkResourceIsReachableAndReturnError:&error]) {
  // do something
} else {
  NSLog(@"%@", error);
}

最直接的解决方案。无需依赖 fileManager。
这在 Swift 领域有一个问题,如果该项目不可访问,则 checkResourceIsReachable() 会引发异常 (!)。因此,您必须竭尽全力捕捉异常而不是检查返回结果......
@KendallHelmstetterGelner 实际上你没有。查看我的回答here
谢谢,我看了一下并发表了评论。我喜欢尝试的想法?包装器,但我真的不喜欢调用一些我知道主要会引发异常的东西,因为我不想要那种开销。
@KendallHelmstetterGelner Swift 异常没有比“if / then / else”更多的开销。这就是为什么它们必须在它们被抛出的相同范围内处理。它们实际上仍然只是返回码。请参阅 swift book error handling section -> 中的“注意:” ... Swift 中的错误处理不涉及展开调用堆栈,这是一个计算成本很高的过程。因此, throw 语句的性能特征与 return 语句的性能特征相当。
M
Mickaël
if (![fileManager fileExistsAtPath:[storeURL path]]) 

没关系,但要小心:对于这样的网址:

..../Documents/1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50

[storeURL path] 将为您提供该路径(它适用于 [storeURL lastPathComponent]

..../Documents/1158a3c96ca22c41b8e731b1d1af0e1e

但是如果你在像 /var/mobile/Applications/DB92F4DC-49E4-4B4A-8271-6A9DAE6963BC/Documents/1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50 这样的字符串上使用 lastPathComponent,它会给你 1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50

这很好,因为在 url 中,'?'用于GET参数,但如果与字符串混合,可能会遇到麻烦。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅