本文介绍一下:
1.获取指定目录下的文件
2.向文件内追加写入
3.读取文件中的内容
看一下实现效果:
实现步骤:
1.使用 fileIo.writeSync(fd: number, buffer: ArrayBuffer | string, options?: WriteOptions)写入到文件中
// 文件不存在时创建并打开文件,文件存在时打开文件
let file = fileIo.openSync(filesDir + fileName, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
// 写入一段内容至文件
let writeLen = fileIo.writeSync(file.fd, str);
fileIo.closeSync(file);
复制代码
这种写法,每次都是从文件的开头写入,会覆盖之前的内容,肯定不是我们要实现的效果,因此可以设置 WriteOptions,可以设置偏移量,从文件末尾写入
2.以同步方法基于文本方式读取文件(即直接读取文件的文本内容)readTextSync(filePath: string, options?: ReadTextOptions)
function readFileSync(): string {
let content = ''
let readTextOptions: ReadTextOptions = {
encoding: 'utf-8'
};
try {
content = fileIo.readTextSync(filesDir + fileName,readTextOptions)
}catch (e) {
}
return content;
}
复制代码
3.获取到当前文件的内容,然后写入最后面的位置,应该就可以了吧?
发现,插入位置不对,插入内容多了个异常符合,这是为什么呢?
4.尝试了多次,发现只有汉字会出现这种情况,那肯定是计算文件长度的时候出了问题,1 个汉字的长度是 1,但是 UTF-8 编码时大部分是 3,所以需要在计算长度时做个转码
//string转Uint8Array
function stringToUint8Array(str: string): Uint8Array {
if (isEmpty(str)){
return new Uint8Array()
}
try {
let textEncoder = new util.TextEncoder("utf-8");
let array: Uint8Array = textEncoder.encodeInto(str);
return array
} catch (err) {
return new Uint8Array()
}
}
复制代码
5.修改 offset:stringToUint8Array(readFileSync())
写入汉字,符号,都显示正常了
核心代码:
function writeFile(str:string): void {
// 文件不存在时创建并打开文件,文件存在时打开文件
let file = fileIo.openSync(filesDir + fileName, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
// 写入一段内容至文件
let writeLen = fileIo.writeSync(file.fd, str,{offset:stringToUint8Array(readFileSync()).length});
fileIo.closeSync(file);
}
function readFileSync(): string {
let content = ''
let readTextOptions: ReadTextOptions = {
encoding: 'utf-8'
};
try {
//如果文件内容为空会报错,因此加个catch
content = fileIo.readTextSync(filesDir + fileName,readTextOptions)
}catch (e) {
}
return content;
}
function deleteFile(): void {
let filePath =filesDir + fileName;
try {
//如果文件不存在 会报错
fileIo.unlinkSync(filePath);
}catch (e) {
//No such file or directory
}
}
// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;
let fileName = '/'+new Date().getFullYear()+'_'+(new Date().getMonth()+1)+'_'+new Date().getDate()+'_'+new Date().getHours()+'.txt'
// 查看文件列表
function getListFile(): string[] {
let listFileOption: ListFileOptions = {
recursion: false, //是否递归子目录下文件名
listNum: 0, //当设置0时,列出所有文件
filter: {
suffix: [".png", ".jpg", ".txt"], //文件后缀名完全匹配
displayName: ["*"], //文件名模糊匹配
fileSizeOver: 0, //文件大小匹配,大于指定大小的文件
lastModifiedAfter: new Date(0).getTime() //文件最近修改时间匹配
}
};
//以同步方式列出当前目录下所有文件名和目录名
let files = fileIo.listFileSync(filesDir, listFileOption);
return files
}
复制代码
读文件还有其他的方式,例如按行读:readLinesSync(filePath: string, options?: Options): ReaderIterator
以同步方式逐行读取文件的文本内容
function readFile(): string {
let content = ''
let file = fileIo.openSync(filesDir + fileName, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
let options: Options = {
encoding: 'utf-8'
};
//逐行读取文件文本内容
let readerIterator = fileIo.readLinesSync(filesDir + fileName, options);
try {
//如果文件内容为空,会报错
for (let it = readerIterator.next(); !it.done; it = readerIterator.next()) {
content+=it.value
}
fileIo.closeSync(file);
}catch (e) {
fileIo.closeSync(file);
}
return content;
}
复制代码
总结:
1.需要注意写入位置,汉字的长度计算
2.读取空文件,活删除不存在的文件时需要 catch
评论