我正在尝试将我在应用程序中收集的一些字符串输出到文本文件。
文本文件将始终存在于我的项目中,如下所示:
我试图用新的(多行)字符串覆盖文件中的所有内容:
func writeFile(){
let theFile: FileHandle? = FileHandle(forWritingAtPath: "./MyFiles/file.txt")
if theFile != nil { // This is always nil!!!
let data = ("Some text\nline 2\nline3\n" as String).data(using: String.Encoding.utf8)
// Write it to the file
theFile?.write(data!)
// Close the file
theFile?.closeFile()
}
else {
print("Writing failed.")
}
} // End file writing
但是,FileHandler 始终返回 nil。我怀疑这是因为我提供的路径和/或文件名不正确?
我已经用谷歌搜索了几个小时,堆栈溢出了……但仍然不知道如何解决这个问题。如何指定正确的位置和文件?
您无法在应用程序沙箱之外写入文件。每个 iOS 应用程序都有单独的目录 Document、Library、tmp 来存储数据。
func writeFile(){
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentsDirectory,.userDomainMask,true)
let theFile: FileHandle? = FileHandle(forWritingAtPath: "\(documentsPath)/MyFiles/file.txt")
if theFile != nil { // This is always nil!!!
let data = ("Some text\nline 2\nline3\n" as String).data(using: String.Encoding.utf8)
// Write it to the file
theFile?.write(data!)
// Close the file
theFile?.closeFile()
}
else {
print("Writing failed.")
}
} // End file writing
我正在尝试覆盖文件中的所有内容
你不能。禁止写入应用程序包。
这种情况下的正确方法是,在首次启动时,将文件复制到可写的 Documents 文件夹中。现在您可以从那里访问它们,并且它们都是可读可写的。
自 iOS 16 和 macOS 13
URL.documentsDirectory
可用。为了简洁起见,使用 Data.write(to:)
快捷键:
let path = URL.documentsDirectory.appending(path: "binary.data")
let data = Data([0xca, 0xfe, 0xba, 0xbe])
try data.write(to: path)
这会将二进制数据写入
Data/Application/<app-uuid>/Documents/binary.data
使用 FileHandle 进行更多控制。以下示例展示了如何仅附加到文档目录中的文件:
let logData = Data(...)
let path = URL.documentsDirectory.appending(path: "persistent.log")
let fileHandle = try FileHandle(forWritingTo: path)
fileHandle.seekToEndOfFile()
try fileHandle.write(contentsOf: logData)
要查看 iOS 应用程序生成的文件:
写入的文件应位于容器的AppData/Document目录下。