gpt4 book ai didi

macos - isDirectory 参数是否为 +[NSURL fileURLWithPath :isDirectory:] need to be correct?

转载 作者:行者123 更新时间:2023-12-03 16:08:06 25 4
gpt4 key购买 nike

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

This method assumes that path is a directory if it ends with a slash. If path does not end with a slash, the method examines the file system to determine if path is a file or a directory. If path exists in the file system and is a directory, the method appends a trailing slash. If path does not exist in the file system, the method assumes that it represents a file and does not append a trailing slash.

如果可能的话,我想避免这种开销。但我并不总是提前知道我正在构建的 URL 是否是一个目录。例如,我可能只得到一个路径,或者我可能得到一个目录和其中的项目(未知类型)的名称。我的问题是,即使结果可能不准确,也可以始终为 isDirectory 传递 NO 吗?

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

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

A Boolean value that specifies whether path is treated as a directory path when resolving against relative path components. Pass YES if the path indicates a directory, NO otherwise.

事实上,如果我使用 -[NSURL initWithString:relativeToURL:],新 URL 不包含 baseURL 的最后一个组件,除非它是使用 创建的YES 表示 isDirectory。但是,我认为我从未调用过此方法,而且系统似乎不需要代表我这样做(对于上述用例)。我注意到 -[NSURL URLByAppendingPathComponent:] 在必要时插入斜杠,而不是假设 IS_DIRECTORY 标志是正确的。那么,除了创建相对 URL 之外,这个标志还重要吗?即使我愿意,在一般情况下似乎也不可能始终传递正确的值。文件系统总是可以在我的控制下发生变化。如果我使用 +[NSURL fileURLWithPath:] ,系统也无法始终确定它,因为文件系统中可能尚不存在该路径。

最佳答案

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

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

NSURL *baseURL = [NSURL fileURLWithPath:path isDirectory:YES];
NSURL *result = [NSURL URLWithString:@"relative/path" relativeToURL:baseURL];

将产生与此不同的结果:

NSURL *baseURL = [NSURL fileURLWithPath:path isDirectory:NO];
NSURL *result = [NSURL URLWithString:@"relative/path" relativeToURL:baseURL];

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

关于macos - isDirectory 参数是否为 +[NSURL fileURLWithPath :isDirectory:] need to be correct?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18665370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com