使用 NSURL 访问本地文件

Posted

技术标签:

【中文标题】使用 NSURL 访问本地文件【英文标题】:Accessing Local file using NSURL 【发布时间】:2011-02-10 17:16:02 【问题描述】:

我正在尝试访问资源目录中的 XML 文件存储。我正在使用 NSURL 使用 NSURLConnection 访问这个文件(这个文件将来会被换成远程服务)。

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL 
URLWithString:@"file:///XMLTest.xml"] 
cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
if (connection) 
    // Create the NSMutableData to hold the received data.
    // receivedData is an instance variable declared elsewhere.
    response = [[NSMutableData data] retain];
 else 
    NSLog(@"Could not create connection");

启动连接的类实现了 NSURLConnection 方法:

connection:willCacheResponse: 
connection:didReceiveData: 
connectionDidFinishLoading: 
connectionDidFinishLoading:

一旦我启动它,模拟器就会死掉,控制台上不会打印任何消息,所以我不知道去哪里找。有什么想法,还是我这样做完全错了?

【问题讨论】:

【参考方案1】:

试图从文件系统 root 加载任何东西是错误的,错误的,错误的。在设备上肯定是错误的,在模拟器上也可能是错误的。资源目录应通过NSBundle 类访问。

例如,要获取资源中名为“Data.txt”的文件的 URL,请使用以下命令:

NSURL *MyURL = [[NSBundle mainBundle]
    URLForResource: @"Data" withExtension:@"txt"];

【讨论】:

同意。这是访问资源文件夹的正确方法! 我的印象是ios上的'/'访问了应用程序沙箱根目录,我很容易错了。这是我用来获取 url 的代码,应用程序仍然崩溃,但这似乎是一个更聪明的举动。 ` NSURL *url = [[NSBundle mainBundle] URLForResource:@"XMLTest" withExtension:@"xml"];` 在模拟器上,/似乎是主机根目录。这意味着您将在设备和模拟器上获得截然不同的结果 - 不好。无论如何,沙箱根目录与捆绑资源文件夹不同。 您能否通过提供更多代码来扩展您的答案?我正在关注但它不起作用:NSURL *bundleResourcePath = [[NSBundle mainBundle] resourceURL];NSURL *url = (NSURL *) [[NSBundle mainBundle] pathForResource:@"SomeImage" ofType:@"png" inDirectory:[NSString stringWithContentsOfURL:bundleResourcePath encoding:NSStringEncodingConversionExternalRepresentation error:nil]];NSLog(@"bundleResourcePath: %@", bundleResourcePath);NSLog(@"url: %@", url);。第一个 NSLog 正确显示了 URL,但是第二个输出 (null)。 @CocoaNoob:已编辑。但是您似乎对路径和 URL 感到困惑。【参考方案2】:

如果您想从路径中获取 URL(例如,因为您在 NSTemporaryDirectory() 中创建了一个文件并且您需要将其作为 URL 获取),您可以使用 NSURL 的 fileURLWithPath 方法轻松地做到这一点:

NSString* tempPath = NSTemporaryDirectory();
NSString* tempFile = [tempPath stringByAppendingPathComponent:fileName];
NSURL* URL = [NSURL fileURLWithPath:tempFile];

比 +URLWithString: 和其他方法容易得多。

【讨论】:

【参考方案3】:

这也可以:

Obj-C

NSString *path = [[NSBundle mainBundle] pathForResource:@"XMLTest" ofType:@"xml"];

斯威夫特 5

let url = Bundle.main.url(forResource: "XMLTest", withExtension: "xml")!

希望这会有所帮助!

【讨论】:

这个给出文件系统路径,而不是 URL。我不明白为什么,但 OP 想从 URL 加载他的 XML。也许是为了更容易移植到基于网络的资源...... 虽然我的答案已经被标记为正确答案,但我相信Seva的答案其实是正确的!可以更新吗? 文件需要位于文件夹层次结构中的什么位置才能工作?【参考方案4】:

你可以试试这个

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"file://localhost/Users/userName/Desktop/XMLTest.xml"]];

这里假设文件在桌面。

【讨论】:

我使用文件的绝对路径,这对我有帮助。【参考方案5】:

斯威夫特 3:

    let myFileName = "somefilename"
    let myURL = Bundle.main.url(forResource: myFileName, withExtension: "png") 

【讨论】:

以上是关于使用 NSURL 访问本地文件的主要内容,如果未能解决你的问题,请参考以下文章

NSURL

如何使用 NSURL 检索本地文件?

在另一个应用程序中访问的 iPhone NSURL 字符串/HTML 本地应用程序资源

iOS WebView 加载本地资源(图片,文件等)

用AVPlayerViewController 播放本地文件时的注意点

iPhone - 来自本地文件 URL 的 NSData