OpenHarmony——文件管理系列(1) 原创 精华

深开鸿
发布于 2022-2-24 13:50
浏览
3收藏

作者:刘庆业

前言

	本系列记录团队openHarmony 的学习和实践中,所踩过的坑以及填坑的记录,可能社区已有分享相关的文档,但也不妨大家一起探讨。如有不妥,也敬请大神指教。

文件管理

	文件管理的功能点较多,团队将持续学习试验,并总结相应的知识点与大家分享。官方接口API:
	https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-fileio-0000001168366687
	https://gitee.com/openharmony/interface_sdk-js/blob/master/api/@ohos.fileio.d.ts

一、文件打开

​ 文件打开方法,有3个参数path、flags、mode。其中flags表示 打开文件 ,默认以只读方式打开 ;mode,若创建文件 , 则指定文件的权限,默认给定0o666 。

// 异步方式1:promise形式打开文件
let fd = await fileio.open(path, 0o1, 0o0200);

// 异步方式2:使用callback形式打开文件
await fileio.open(path, 0, function(err, fd) {
});

// 同步方式打开文件
let fd = fileio.openSync(path,flags,mode);
参数名 类型 必填 说明
flags number 打开文件的选项,必须指定如下选项中的一个,默认以只读方式打开:0o0:只读打开。<br/>0o1:只写打开。<br/>0o2:读写打开。<br/>同时,也可给定如下选项,以按位或的方式追加,默认不给定任何额外选项:<br/>0o100:若文件不存在,则创建文件。使用该选项时必须指定第三个参数 mode。<br/>0o200:如果追加了0o100选项,且文件已经存在,则出错。<br/>0o1000:如果文件存在且以只写或读写的方式打开文件,则将其长度裁剪为零。<br/>0o2000:以追加方式打开,后续写将追加到文件末尾。<br/>0o4000:如果path指向FIFO、块特殊文件或字符特殊文件,则本次打开及后续 IO 进行非阻塞操作。<br/>0o200000:如果path指向目录,则出错。<br/>0o400000:如果path指向符号链接,则出错。<br/>0o4010000:以同步IO的方式打开文件。
mode number 若创建文件,则指定文件的权限,可给定如下权限,以按位或的方式追加权限,默认给定0o666。<br/>0o666:所有者具有读、写权限,所有用户组具有读、写权限,其余用户具有读、写权限。<br/>0o700:所有者具有读、写及可执行权限。<br/>0o400:所有者具有读权限。<br/>0o200:所有者具有写权限。<br/>0o100:所有者具有可执行权限。<br/>0o070:所有用户组具有读、写及可执行权限。<br/>0o040:所有用户组具有读权限。<br/>0o020:所有用户组具有写权限。<br/>0o010:所有用户组具有可执行权限。<br/>0o007:其余用户具有读、写及可执行权限。<br/>0o004:其余用户具有读权限。<br/>0o002:其余用户具有写权限。<br/>0o001:其余用户具有可执行权限。

二、文件写入

​ 文件写入,官方提供了多种方式可以实现,比如:

let fd = fileio.openSync(fpath, 0o102, 0o666);

// 异步方式1:promise形式返回结果
let num = await fileio.write(fd, "hello, world");// 返回结果:Promise<number>

// 异步方式2:使用callback形式返回结果
fileio.write(fd, "hello, world", function (err, bytesWritten) {
    if (!err) {
       console.log(bytesWritten)
    }
});

// 同步方式
let num = fileio.writeSync(fd, "hello, world");

​ 文件写入前,如果写入文件的路径不存在,则直接写入会报错,所以需要判断路径是否存在后,需要根据业务情况进行处理。设想的处理方式有2种,我们则采用第一种方案:

​ 1)根据原定文件路径,创建相关文件夹,完成创建路径所需的文件夹后,创建文件并写入;

​ 2)提示用户,写入路径不存在;

​ 创建文件夹的接口,下面会由讲述。

三、文件读取

​ 文件读取,也有相应的接口,例如:

let fd = fileio.openSync(path, 0o2);
let buf = new ArrayBuffer(4096);

// 异步方式1:promise形式返回结果
let res = await fileio.read(fd, buf); // 返回结果:Promise<Readout>

// 异步方式2:使用callback形式返回结果
await fileio.read(fd, buf, function (err, readOut) {
    if (!err) {
        console.log(String.fromCharCode.apply(null, new Uint8Array(readOut.buffer)))
    }
});

// 同步方式
let num = fileio.readSync(fd, buf);

四、文件路径判断

​ 读取写入之前,都需要判断下文件路径是否存在,那么可用下面这个接口判断。

// 异步方式1:promise形式返回结果
fileio.access(path)    
    .then(function(err) {
        // 文件存在,do something
    }).catch(function(e) {
        //若不符合条件则进入
});

// 异步方式2:使用callback形式返回结果
fileio.access(path, function (err) {
});

// 同步方式
try {
    /** 
    * path:待访问文件的绝对路径。
    * mode:确认当前进程是否具有对应权限:
            0:确认文件是否存在。
            1:确认当前进程是否具有可执行权限。
            2:确认当前进程是否具有写权限。
            4:确认当前进程是否具有读权限。
    **/
    fileio.accessSync(path, mode);
} catch(e) {
    //不符合条件则进入
}

五、创建文件夹

​ 创建文件夹的方法如下,如果需要设置文件夹的访问权限,可以设置mode参数值:

// 异步方式1:promise形式创建文件夹
await fileio.mkdir(path, mode)
   .then(function(err) {
    // 目录创建成功,do something
   }).catch(function (e){
   });

// 异步方式2:使用callback形式创建文件夹
await fileio.mkdir(path, mode, function(err) {
    if (!err) {
        // do something
    }
});

// 同步方式创建文件夹
fileio.mkdirSync(path, mode);

六、个人总结

​ 本次分享的内容仅是文件管理模块学习研究的开端,希望与大家共同成长。

更多原创内容请关注:深开鸿技术团队

入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-2-25 09:58:25修改
3
收藏 3
回复
举报
回复
    相关推荐