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

时间:2017-05-09 10:29:15

标签: ios swift3 filehandle

我的代码如下:

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)

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

4 个答案:

答案 0 :(得分:3)

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

  

初始化文件句柄对象,如果url中没有文件,则为nil。

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

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

创建文件。

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

如果您明确创建了文件,代码可能会更具可读性:

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

答案 1 :(得分:0)

用作

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

答案 2 :(得分:0)

当我运行带有错误信息打印的代码时,

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

我有错误信息说
“错误:操作无法完成。(可可错误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)")
       }
    }

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

答案 3 :(得分:0)

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