我们啥时候应该使用 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(string
和 absoluteString
是用于处理文件系统路径的错误 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?