阅读 611

用Swift的FileHandle进行文件写入

在项目中我们经常有针对二进制或者文本文件进行局部读写、追加数据等需求。在C语言里用fopen系列函数就能解决。而在Swift语言里可以通过FileHandle来处理。

下面通过代码示例来讲解下FileHandle的用法。

首先先定义一个文件路径,作为测试文件

let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] + "test.txt"
复制代码

接下来判断文件是否存在,不存在就创建。

注意:由于FileHandle的创建要求文件必须存在,这和C语言的fopen不同,C语言的fopen可以负责在文件不存在时创建,而FileHandle不行。

if !FileManager.default.fileExists(atPath: path) {
    FileManager.default.createFile(atPath: path, contents: nil, attributes: nil)
}
复制代码

接下来,我们创建一个FileHandle

let fileHandle = FileHandle(forWritingAtPath: path)!
复制代码

简化起见我这里用“!强制类型为非空,实际开发中请用if分支,不再赘述。

将文件指针移动到文件末尾。

fileHandle.seekToEndOfFile()
复制代码

进入写入数据的阶段,我这里写入字符串hello, world!

fileHandle.write("hello, world!".data(using: .utf8)!)
复制代码

最后,记得要关闭文件。

try? fileHandle.close()
复制代码

文件关闭后,读一下现在文件里的数据并且打印出来。

if let content = try? String(contentsOfFile: path, encoding: .utf8) {
    print(content)
}
复制代码

如果是首次运行,打印结果是hello, world!,如果再次运行,结果会变成hello, world!hello, world!,依此类推。

完整代码示例:

let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] + "test.txt"
if !FileManager.default.fileExists(atPath: path) {
    FileManager.default.createFile(atPath: path, contents: nil, attributes: nil)
}

let fileHandle = FileHandle(forWritingAtPath: path)!
fileHandle.seekToEndOfFile()
fileHandle.write("hello, world!".data(using: .utf8)!)
try? fileHandle.close()

if let content = try? String(contentsOfFile: path, encoding: .utf8) {
    print(content)
}
复制代码

其它分享:

2021年遭遇苹果审核2.3.1的开发过审经历

4.2、4.3、Other和封号相关的技术性应对方案

如何有效的向苹果哭诉


移动开发者的小伙伴们可以加我的公众号风海铜锣的加群菜单栏中申请加群完成加群申请,一起共同进步。

文章分类
iOS
文章标签