使用 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 访问本地文件的主要内容,如果未能解决你的问题,请参考以下文章
在另一个应用程序中访问的 iPhone NSURL 字符串/HTML 本地应用程序资源