使用 FileHandler 写入文件时出现问题

Problems when writing to file with FileHandler

我的代码如下所示:

let fileName = "name.txt"
let fileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName)
try! "".write(to: fileURL, atomically: true, encoding: String.Encoding.utf8)
let fileHandle = try! FileHandle(forWritingTo: fileURL)
fileHandle.seekToEndOfFile()

并且此代码有效。但是,如果我删除该行:

try! "".write(to: fileURL, atomically: true, encoding: String.Encoding.utf8)

我遇到运行时异常。我不确定为什么需要这一行?

照此使用

let fileName = "name.txt"
let fileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName)

let text = ""

 do
 {
    try text.write(to: fileURL, atomically: false, encoding: .utf8)
 }
 catch {
        print("error" , error)
 }

当我运行 错误信息的代码像这样打印时,

    do {
        let fileHandle = try FileHandle(forWritingTo: fileURL)
        fileHandle.seekToEndOfFile()
    } catch {
        let nsError = error as NSError
        print("ERROR : " + nsError.localizedDescription)
    }

我收到错误消息
"ERROR : The operation couldn’t be completed. (Cocoa error 2.)"

此问题与此问题相同。

您需要在调用之前创建文件

FileHandle(forWritingTo: fileURL)

所以,这应该可行。

    let fileName = "test.txt"
    let textContent = "foobar"

    if let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last {
       let filePath = fileURL.appendingPathComponent(fileName)

       do {
          try textContent.write(to: filePath, atomically: true, encoding: String.Encoding.utf8)
       } catch let error as NSError {
          print("error: \(error)")
       }
    }

不要忘记检查错误消息:)

如果您查看 FileHandle(forWritingTo:) 的文档,return 值指定为:

The initialized file handle object or nil if no file exists at url.

文件必须存在,否则 nil 是 returned。

try! "".write(to: fileURL, atomically: true, encoding: String.Encoding.utf8)

创建文件。

如果您不创建该文件并且该文件不存在,尝试使用 FileHandle 打开该文件将使应用程序崩溃。

如果您显式创建文件,代码可能更具可读性:

FileManager.default.createFile(atPath: fileURL.path, contents: nil)

更好的实现是使用 POSIX 文件描述符,它允许您在文件不存在时创建文件或在文件存在时将其截断为零长度,所有操作都在一个操作中完成(它还允许更多标志,例如用于独占锁定):

let fileDescriptor = open(fileURL.path, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR)

if fileDescriptor == -1 {
    let posixErrorCode = POSIXErrorCode(rawValue: errno)!
    throw POSIXError(posixErrorCode)
}

let fileHandle = FileHandle(fileDescriptor: fileDescriptor, closeOnDealloc: true)