Swift 4.0-无法在iOS中创建空文本文件

时间:2018-09-24 14:15:01

标签: ios swift nsfilemanager

下面是我的代码- 我尝试获取文档目录路径,并使用标准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)
}

3 个答案:

答案 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