本文介绍一下:
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转Uint8Arrayfunction 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
评论