我的代码如下:
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)
我得到运行时异常。我不确定为什么需要这条线?
答案 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)