iOS:如何写入项目中特定目录下的文件?

问题描述 投票:0回答:3

我正在尝试将我在应用程序中收集的一些字符串输出到文本文件。

文本文件将始终存在于我的项目中,如下所示:

我试图用新的(多行)字符串覆盖文件中的所有内容:

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 swift iphone file
3个回答
4
投票

您无法在应用程序沙箱之外写入文件。每个 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

0
投票

我正在尝试覆盖文件中的所有内容

你不能。禁止写入应用程序包。

这种情况下的正确方法是,在首次启动时,将文件复制到可写的 Documents 文件夹中。现在您可以从那里访问它们,并且它们都是可读可写的。


0
投票

自 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 应用程序生成的文件:

  • 打开 Xcode > 窗口 > 设备和模拟器
  • 选择应用程序运行的设备
  • 在“已安装的应用程序”下选择应用程序
  • 按齿轮或...按钮
  • 选择下载容器...
  • 右键单击(或双指点击)下载的容器并选择显示包内容

写入的文件应位于容器的AppData/Document目录下。

© www.soinside.com 2019 - 2024. All rights reserved.