【问题标题】:Problems when writing to file with FileHandler使用 FileHandler 写入文件时出现问题
【发布时间】:2017-05-09 10:29:14
【问题描述】:

我的代码如下所示:

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)

我得到运行时异常。我不确定为什么需要这条线?

【问题讨论】:

    标签: ios swift3 filehandle


    【解决方案1】:

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

    初始化的文件句柄对象,如果 url 中不存在文件,则为 nil。

    文件必须存在,否则返回nil

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

    创建文件。

    如果你不创建文件且文件不存在,尝试使用FileHandle打开文件会导致应用崩溃。

    如果你明确地创建了文件,代码可能会更易读:

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

    【讨论】:

      【解决方案2】:

      一个更好的实现是使用 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)
      

      【讨论】:

        【解决方案3】:

        像这样使用

        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)
         }
        

        【讨论】:

          【解决方案4】:

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

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

          我收到错误消息说
          "ERROR : 操作无法完成。(Cocoa 错误 2.)"

          这和这个问题是一样的。
          NSFileHandle from NSURL failure

          调用前需要先创建文件

          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)")
                 }
              }
          

          别忘了检查错误信息:)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-22
            • 2014-01-28
            • 2014-07-07
            • 1970-01-01
            相关资源
            最近更新 更多