+ [NSURL fileURLWithPath:isDirectory:]的isDirectory参数是否正确?

Mic*_*sai 6 macos cocoa nsurl filepath nsfilemanager

我长期以来一直在使用+[NSURL fileURLWithPath:]它,因为它很方便,但是在分析中发现这是瓶颈的根源,因为它在调用+[NSURL fileURLWithPath:isDirectory:](或与Core Foundation等效)之前查询文件系统:

如果此方法path以斜杠结尾,则假定它是目录。如果path不以斜杠结尾,则该方法检查文件系统以确定path是文件还是目录。如果path文件系统中存在一个目录,并且该目录是目录,则该方法将附加一个斜杠。如果path文件系统中不存在该方法,则该方法假定它表示一个文件,并且不附加斜杠。

如果可能,我想避免这种开销。但是我并不总是提前知道我正在构建的URL是否是目录。例如,可以给我一个路径,或者给我一个目录以及其中的项目名称(未知类型)。我的问题是,是否确定总是传递NOisDirectory,即使这可能会变成不准确?

特别是,我想确保这不会弄乱-[NSURL getResourceValue:forKey:error:]NSFileManager

一些基本测试并未揭示此优化有任何不良后果,但这并不意味着没有任何不良后果。我尚不清楚为什么 首先NSURL在意isDirectory。查看CFURL 源代码,该代码似乎试图确保目录路径始终以斜杠结尾。但是,除了出于显示目的,我不清楚为什么这对文件系统路径很重要。(当NSString用于表示路径时,这从来不是问题。)的文档+[NSURL fileURLWithPath:isDirectory:]isDir

一个布尔值,它指定path在解决相对路径组件时是否将其视为目录路径。YES如果路径指示目录,NO则通过;否则,请通过。

的确,如果我使用-[NSURL initWithString:relativeToURL:]baseURL除非使用YESfor 创建新的URL,否则新URL不包括它的最后一个组成部分isDirectory。但是,我认为我从未调用过这种方法,并且似乎系统不需要代表我这样做(对于上述用例)。我注意到,-[NSURL URLByAppendingPathComponent:] 如有必要,请插入斜杠,而不是假设该IS_DIRECTORY标志正确。因此,除了创建相对URL外,此标志还重要吗?即使我愿意,在一般情况下似乎也始终无法传递正确的值。文件系统总是可以从我下面变出来。如果我使用该系统,系统也永远无法确定它,+[NSURL fileURLWithPath:]因为该路径可能尚未在文件系统中存在。

Mik*_*lah 1

如果您传入NO并始终创建非目录 URL,那么对于使用 URL 访问文件系统的任何例程(例如-getResourceValue:forKey:error:NSFileManager)来说绝对没问题。

对于URL,只有当您想要根据URLfile解析路径时,尾部斜杠才真正变得重要。即这个片段:

NSURL *baseURL = [NSURL fileURLWithPath:path isDirectory:YES];
NSURL *result = [NSURL URLWithString:@"relative/path" relativeToURL:baseURL];
Run Code Online (Sandbox Code Playgroud)

将产生与此不同的结果:

NSURL *baseURL = [NSURL fileURLWithPath:path isDirectory:NO];
NSURL *result = [NSURL URLWithString:@"relative/path" relativeToURL:baseURL];
Run Code Online (Sandbox Code Playgroud)

在实践中,处理fileURL 的相对字符串/路径往往并不常见。远程 URL 更需要它(当然取决于您的应用程序的用途!)