我已经看到很多关于在NSURL
和NSString
之间进行转换的问题。它们都涉及使用NSString *path = [myURL absoluteString];
或NSString *path = [myURL path];
。 这些方法之间的实际差异是什么? 是否有时间应该使用其他方法?我尝试咨询Apple Docs,但我发现了不太乐于助人。
我习惯于在网站和其他有关在不同机器之间发送信息的主题的讨论中提到URL,而在单个机器上处理文件结构时从未被提及。也许这就是我的一些困惑所在,因为NSURL
似乎是访问文件的首选方式,无论该文件是存在于网络上还是存在于本地设备上。或者这可能是一个完全不相关的话题。我甚至都不确定。
答案 0 :(得分:133)
这些方法之间的实际区别是什么?
让我们分析这6行代码 - 3代表本地代码,3代表http代码 - 并稍微使用它们。
让我们使用NSURL
方案创建file://
。如果你问自己为什么在/
之后有3 file:
你应该记住一个完整的URL存在一个方案(file://
和绝对或相对路径(你可以找到有关创建URL的更多信息)在RFC 1808 on page 3)。我们使用以/
开头的绝对路径,以便最终得到///
。
NSURL *aLocalURL = [NSURL URLWithString:@"file:///Users/dennis/Desktop/"];
NSLog(@"absolute string: %@", aLocalURL.absoluteString);
NSLog(@"path: %@", aLocalURL.path);
<强>输出:强>
绝对字符串:file:/// Users / dennis / Desktop /
路径:/ Users / dennis / Desktop
因此,我们看到absoluteString
仍知道其方案,而path
不再拥有此信息。
注意: path
是一个文件(目录)URL,作为docs状态,它被删除尾部斜杠。
现在让我们来看看远程URL。使用这些类型的URL,大多数人都更熟悉。我们使用与本地URL相同的过程创建它。我们的方案现在为http://
,我们的path
为www.apple.com/
。
NSURL *anHTTPURL = [NSURL URLWithString:@"http://www.apple.com/"];
NSLog(@"absolute string: %@", anHTTPURL.absoluteString);
NSLog(@"path: %@", anHTTPURL.path);
<强>输出:强>
绝对字符串:http://www.apple.com/
路径:/
同样,我们看到绝对字符串仍然知道它的方案,但path
现在是/
。因此,path
似乎不适合使用远程网址。
但是,当我们有URL
http://www.apple.com/index.html
时,我们会得到
绝对字符串:http://www.apple.com/index.html
路径:/index.html
阅读文档也有帮助:
根据RFC 3986,权限(主机名和端口)部分之后的前导斜杠被视为路径的一部分。
所以path
就是authority
之后的斜线上的所有内容(包括),在我们的情况下是www.apple.com
。
是否有人应该使用另一个?
来自docs :(方法:path
)
如果此URL对象包含文件URL(由isFileURL确定),则此方法的返回值适合输入NSFileManager或NSPathUtilities的方法。
在我看来,当您使用path
或NSFileManager
时,您应该使用NSPathUtilities
这句话明确 。
当您使用远程网址时,您(通常)使用absoluteString
,否则结果不是您(通常)想要的结果。
使用本地网址时,请使用path
。
来源:
http://www.ietf.org/rfc/rfc1808.txt
http://www.ietf.org/rfc/rfc3986.txt
NSURL Class Reference
答案 1 :(得分:0)
添加到HAS'响应 - Apple文档提到基于路径的URL在某些方面更简单,但是文件引用URL的优点是,如果在应用程序运行时移动或重命名文件,则引用仍然有效。
从“访问文件和目录”文档:
“基于路径的URL更易于操作,更易于调试,并且通常是NSFileManager等类的首选。文件引用URL的一个优点是,当您的应用程序运行时,它们不如基于路径的URL脆弱。如果用户在Finder中移动文件,任何引用该文件的基于路径的URL都会立即变为无效,并且必须更新到新路径。但是,只要文件移动到同一磁盘上的另一个位置,其唯一ID不会更改,任何文件引用网址仍然有效。“
答案 2 :(得分:0)
还有一个注意事项,我只为Swift和URL
而不是NSURL
尝试过。 URL的relativeTo
形式:
URL(fileURLWithPath: aPath, relativeTo: URL)
生成的URL行为不完全像远程URL(如上面的@HAS),也不像文件URL。
例如,
let url0 = URL(fileURLWithPath: "/Foo")
let url1 = URL(fileURLWithPath: "Bar", relativeTo: url0)
print("\(url1.path)")
// Output: "/Bar\n"
(类似于远程URL的结果,而不是文件URL的结果。)
如果我们使用absoluteString
,我们将得到:
print("\(url1.absoluteString)")
// Output: "file:///Bar\n"
(不同于文件URL或远程URL)。