【发布时间】:2013-09-11 00:03:15
【问题描述】:
我一直在使用+[NSURL fileURLWithPath:],因为它很方便,但在分析中我发现这是瓶颈的根源,因为它在调用+[NSURL fileURLWithPath:isDirectory:](或Core Foundation 等效项)之前会查询文件系统:
此方法假定
path是一个以斜杠结尾的目录。 如果path不以斜线结尾,则该方法检查文件系统 确定path是文件还是目录。如果path存在于 文件系统并且是一个目录,该方法附加一个斜杠。 如果文件系统中不存在path,则该方法假定它 代表一个文件,不附加斜杠。
如果可能,我想避免这种开销。但我并不总是提前知道我正在构建的 URL 是否是一个目录。例如,可能只给我一个路径,或者给我一个目录和其中的项目(未知类型)的名称。我的问题是,是否可以始终将 NO 传递给 isDirectory,即使结果可能不准确?
特别是,我想确保这不会搞砸 -[NSURL getResourceValue:forKey:error:] 和 NSFileManager。
一些基本测试并未发现此优化有任何不良后果,但这并不意味着没有任何不良后果。我不太清楚为什么NSURL 首先关心isDirectory。查看CFURLsource,代码似乎试图确保目录路径始终以斜杠结尾。但是,除了显示目的之外,我不清楚为什么这对文件系统路径很重要。 (在使用 NSString 表示路径时,这从来都不是问题。)+[NSURL fileURLWithPath:isDirectory:] 的文档说 isDir 是:
一个布尔值,指定是否将
path视为目录 解析相对路径组件时的路径。传递YES如果 path 表示目录,NO否则。
确实,如果我使用-[NSURL initWithString:relativeToURL:],则新 URL 不包含baseURL 的最后一个组件,除非它是使用YES 为isDirectory 创建的。但是,我认为我从未调用过此方法,而且系统似乎不需要代表我这样做(对于上述用例)。我注意到-[NSURL URLByAppendingPathComponent:] 会在必要时插入一个斜杠,而不是假设IS_DIRECTORY 标志是正确的。那么,除了创建相对 URL 之外,这个标志是否重要?即使我愿意,在一般情况下似乎也不可能总是传递正确的值。文件系统总是可以从我下面改变。如果我使用+[NSURL fileURLWithPath:],系统也无法始终确定它,因为文件系统中可能尚不存在该路径。
【问题讨论】:
标签: macos cocoa filepath nsfilemanager nsurl