将文件路径从 NSString 转换为 NSURL
Posted
技术标签:
【中文标题】将文件路径从 NSString 转换为 NSURL【英文标题】:Converting File Path From NSString To NSURL 【发布时间】:2010-01-27 21:45:21 【问题描述】:我正在顺利地解决 Cocoa,但这个问题似乎很简单,它抵消了我学到的所有很酷的东西。 :/
我有一个生成的文件路径,它需要是 NSURL 格式。根据研究,这是我写的代码:
NSLog(@"Old path = %@", pathToFile);
NSURL *xmlURL = [[[NSURL alloc] init] fileURLWithPath:pathToFile];
NSLog(@"New path = %@", [xmlURL absoluteString]);
还有输出:
2010-01-27 15:39:22.105 MusicLibraryStats[28574:a0f] Old path = file://localhost/Users/[username]/Music/iTunes/iTunes%20Music%20Library.xml
2010-01-27 15:39:22.105 MusicLibraryStats[28574:a0f] New path = (null)
首先,alloc-init 甚至不是必需的; other people seem to get away with it。在这种情况下,如果我不分配初始化,我会在该行收到“无法识别的选择器”错误。当然,现在我只是变老了(null)。
我在哪里搞砸了?
谢谢!
【问题讨论】:
【参考方案1】:[[NSURL alloc] init]
不仅没有必要,而且无效。 fileURLWithPath:
是一个类方法,这意味着你只能在类对象(即NSURL
本身)上调用它。它不会产生编译错误,因为-(NSURL *)init
返回类型为id
的对象,并且不会导致运行时错误,因为-(NSURL *)init
实际上返回nil
,并且发送到nil
的消息只会级联另一个@ 987654329@ 作为它们的返回值。
这段代码应该可以工作:
NSString* pathToFile = @"/this/is/a/path";
NSURL* url = [NSURL fileURLWithPath:pathToFile];
我发现了你的问题。
-[NSOpenPanel URLs]
返回一个 NSURL 对象数组,您将其视为 NSString 对象。那是不对的。您应该使用以下内容:
NSURL* url = [[oPanel URLs] objectAtIndex:0];
如果您查看pathToFile
变量,调试器可能会告诉您。确保下次检查。 :) 用鼠标悬停变量应该可以得到它的类型。
但是,请记住,在某些情况下,您会合法地遇到与您预期不同的类型。例如,私有 NSPathStore2 类是 NSString 集群的一部分,您可以在 NSPathStore2 对象上执行 NSString 支持的所有操作。 (如果发生这种情况并且您不太确定,请查看文档以查看您期望的类型是否为集群类型。这就是它们在文档中的调用方式。)
【讨论】:
我明白了。谢谢。有什么方法(如果有的话)可以将我现在拥有的字符串变成你拥有的字符串?断点确实很有用,但在这种情况下我无能为力。我可以进入 fileURLWithPath: ,但如果涉及运行时错误(比如我没有分配初始化时),我能做的最好的就是检查程序集。 您只需要这样做:NSURL *xmlURL = [NSURL fileURLWithPath:pathToFile];
如果您仍有问题,问题可能出在pathToFile
。使用调试器找出答案。
不,字符串绝对是普通的 ol' file://localhost/Users/[username]/Music/iTunes/iTunes%20Music%20Library.xml 。它是使用 NSOpenPanel...pathToFile = [[oPanel URLs] objectAtIndex:0]; 生成的
你需要在NSUrl上调用"path"方法来获取前面没有文件协议的文件路径。以上是关于将文件路径从 NSString 转换为 NSURL的主要内容,如果未能解决你的问题,请参考以下文章