我们啥时候应该使用 FileManager.default.urls 而不是 NSSearchPathForDirectoriesInDomains? [复制]

Posted

技术标签:

【中文标题】我们啥时候应该使用 FileManager.default.urls 而不是 NSSearchPathForDirectoriesInDomains? [复制]【英文标题】:When should we use FileManager.default.urls as opposed to NSSearchPathForDirectoriesInDomains? [duplicate]我们什么时候应该使用 FileManager.default.urls 而不是 NSSearchPathForDirectoriesInDomains? [复制] 【发布时间】:2021-03-18 04:28:07 【问题描述】:

目前,如果我想在 Document 目录中创建目录层次结构,我将执行以下操作


使用 NSSearchPathForDirectoriesInDomains(工作正常)

let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
let documentUrl1 = URL(string: documentsDirectory)!
//
// /Users/yccheok/Library/Developer/...
//
print("documentUrl1 -> \(documentUrl1)")

let dataPath = documentUrl1.appendingPathComponent("SubFolder1").appendingPathComponent("SubFolder2")
print("dataPath.absoluteString -> \(dataPath.absoluteString)")
if !FileManager.default.fileExists(atPath: dataPath.absoluteString) 
    do 
        try FileManager.default.createDirectory(atPath: dataPath.absoluteString, withIntermediateDirectories: true, attributes: nil)
        print("Folder creation done!")
     catch 
        print(error.localizedDescription)
    


但是,如果我使用以下内容

使用 FileManager.default.urls(不工作)

let documentUrl0 = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
//
// file:///Users/yccheok/Library/Developer/...
//
print("documentUrl0 -> \(documentUrl0)")

let dataPath = documentUrl0.appendingPathComponent("SubFolder1").appendingPathComponent("SubFolder2")
print("dataPath.absoluteString -> \(dataPath.absoluteString)")
if !FileManager.default.fileExists(atPath: dataPath.absoluteString) 
    do 
        try FileManager.default.createDirectory(atPath: dataPath.absoluteString, withIntermediateDirectories: true, attributes: nil)
        print("Folder creation done!")
     catch 
        print(error.localizedDescription)
    

将打印以下错误

您无法保存文件“SubFolder2”,因为该卷是只读的。


我想知道,在什么用例下,FileManager.default.urls 会有用?谢谢。

【问题讨论】:

【参考方案1】:

URL(stringabsoluteString 是用于处理文件系统路径的错误 API。

您的代码意外运行,因为 URL(string 应用于 路径 创建了一个路径而不是有效的 URL,而应用于路径的 absoluteString 返回了路径,因为没有方案(file://)。

但是强烈建议您不要这样做。文件系统 URL 必须使用 URL(fileURLWithPath 创建,您可以使用 path 属性获取路径。

我们鼓励您使用FileManager API,因为它提供了更好的错误处理,并且它还提供了与字符串路径 API 相比更受欢迎的 URL 相关 API。

如果目录不存在,这是创建目录的正确FileManager 方式

let fm = FileManager.default
do 
    let documentUrl = try fm.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    //
    // file:///Users/yccheok/Library/Developer/...
    //
    print("documentUrl -> \(documentUrl)")
    
    let dataURL = documentUrl.appendingPathComponent("SubFolder1").appendingPathComponent("SubFolder2")
    print("dataPath.path -> \(dataURL.path)")
    if !fm.fileExists(atPath: dataURL.path) 
        try fm.createDirectory(at: dataURL, withIntermediateDirectories: true, attributes: nil)
        print("Folder creation done!")
    
 catch  print(error) 

【讨论】:

我已删除创建的文件夹,并使用我的第一个示例代码和您建议的代码重新测试。两者都适合我。看来我的documentUrl1.appendingPathComponent(...).absoluteString 与您的dataURL.path 具有相同的价值。 不过absoluteString 是错误的。不要将它与文件系统 URL 一起使用。您的代码意外工作,因为 URL(string 应用于路径会创建路径,而不是 URL。所以absoluteString API 不会造成伤害。但再一次,这是错误的。

以上是关于我们啥时候应该使用 FileManager.default.urls 而不是 NSSearchPathForDirectoriesInDomains? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我们啥时候应该使用 PreparedStatement 而不是 Statement?

我们啥时候应该使用 SNOWPIPE?

我们啥时候应该使用 save() 的高级参数?

我们啥时候应该使用 scala.util.DynamicVariable?

我们啥时候应该使用普通 BFS 而不是双向 BFS?

我们啥时候应该考虑使用私有或受保护?