下面是我的代码- 我尝试获取文档目录路径,并使用标准FileManager单例尝试创建文件,但由于错误-
,我无法创建该文件无法存储数据:Error Domain = NSCocoaErrorDomain代码= 4“文件“ CrashLog.txt”不存在。”
UserInfo = {NSFilePath = file:/// Users / ABC / Library / Developer / CoreSimulator / Devices / 87317777-63E7-422B-A55F-878E3267AFB8 / data / Containers / Data / Application / 4B41AA87-E4B9-4EE4-A67F -AC3B018913CC / Documents / CrashLog, NSUnderlyingError = 0x600000244ec0 {Error Domain = NSPOSIXErrorDomain 代码= 2“没有这样的文件或目录”}}
开发中的代码-
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
if (paths.count > 0) {
let documentsDirectory = paths[0]
let logFilePath = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("CrashLog.txt").absoluteString
let _string = "Hello"
//Create file at given path
let data = _string.data(using: .utf8)
//let attributes = FileManager.default.attributesOfItem(atPath: logFilePath)
let fileExists : Bool = FileManager.default.fileExists(atPath: logFilePath)
print(fileExists)
let isFileCreated = FileManager.default.createFile(atPath: logFilePath, contents: data, attributes: nil)
print("ifFileCreated", isFileCreated)
}
答案 0 :(得分:1)
这是我对您所做的事情的看法。采用基于URL的文件处理方式。写入数据的最佳方法(至少在此示例中如此)至少是使用Data的功能(不是FileManager)再次使用URL写入文件。在大多数情况下,您不必担心文件是否存在。做到这一点,并处理出现的任何错误。
if var url = try? FileManager.default.url(for: .documentDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: false) {
url = url.appendingPathComponent("CrashLog").appendingPathExtension("txt")
let _string = "Hello"
if let data = _string.data(using: .utf8) {
do {
try data.write(to: url)
print("successful")
} catch {
print("unsuccessful")
}
}
}
答案 1 :(得分:0)
appendingPathComponent方法,如果接收方(例如,参数)不以斜杠结尾,则它可以读取文件元数据以确定结果路径是否为目录。这意味着它可能会产生您所看到的错误,因此最好改用appendingPathComponent(_:isDirectory:)。
例如:
let logFilePath = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("CrashLog.txt", isDirectory: false).absoluteString
答案 2 :(得分:0)
API absoluteString
错误。正确的API是path
absoluteString
返回整个URL字符串表示形式,包括方案file://
。另一方面,path
的{{1}} API需要文件系统路径,即字符串没有方案。
无论如何,都鼓励您使用与URL相关的API,并且可以直接将FileManager
写入磁盘,而无需显式创建文件。
Data