鸿蒙关于手机全局本地文件读取,写入

一.背景

需求是需要操作用户手机中的文件,不是应用沙箱

二.解决方案

这里要注意的一点拿到fsOpen.path的路径再去进行open文件,因为这里还不知道本地文件路径在哪里,需要选择一下路径再拿到路径去请求

1.这里就是进行两个fs.open,拿到你需要操作的文件的路径以后第一个就没用了
const DocumentSelectOptions = new picker.DocumentSelectOptions();
      let context = getContext(this) as common.Context;
      // 创建文件选择器实例。
      const documentViewPicker = new picker.DocumentViewPicker(context);
      documentViewPicker.select(DocumentSelectOptions)
        .then(async (documentSelectResult) => {
          // 获取选择路径
          let uri = documentSelectResult[0];
          console.log('e2qdw',uri)
          // 若文件不存在则创建文件
          //const fsOpen = await fs.open(uri,fs.OpenMode.READ_WRITE | fs.OpenMode.READ_ONLY |fs.OpenMode.CREATE)
          //console.log(fsOpen.path)
  const fsOpen = await fs.open(这里的路径就是fsOpen.path,fs.OpenMode.READ_WRITE | fs.OpenMode.READ_ONLY |fs.OpenMode.CREATE)
          // 读取文件
          this.readFile(fsOpen)
          // 写入
          this.writeFile(fsOpen)
        })
        .catch((err:BusinessError) => {
          console.error(`Invoke documentPicker.select failed, code is ${err.code}, message is ${err.message}`);
        })
2.第一步拿到以后就可以替换成这个代码 ,找到需要操作文件的路径,DocumentSelectOptions文件选择器就没用了
 async getFiles() {
    try {
      // 若文件不存在则创建文件
      const fsOpen = await fs.open('/storage/Users/currentUser/Download/jrdl.json',fs.OpenMode.READ_WRITE | fs.OpenMode.READ_ONLY |fs.OpenMode.CREATE|fs.OpenMode.TRUNC)
      // // 读取文件
      this.readFile(fsOpen)
      // this.deleteFile(fsOpen)
      // 写入
      this.writeFile(fsOpen)

    } catch (e) {
      console.error(`Invoke documentViewPicker.save failed, code is ${e.code}, message is ${e.message}`);
    }
  }
3.读写文件代码
readFile(fsOpen:fs.File){
    // 读取文件
    let arrayBuffer = new ArrayBuffer(4096);
    fs.read(fsOpen.fd, arrayBuffer, (err: BusinessError, readLen: number) => {
      if (err) {
        console.error("read failed with error message: " + err.message + ", error code: " + err.code);
      } else {
        console.info("read file data succeed");
        let buf = buffer.from(arrayBuffer, 0, readLen);
        console.info(`成功读取文件内容: ${buf.toString()}`);
      }
      // fs.closeSync(fsOpen);
    });
  }
  writeFile(fsOpen:fs.File){
    let str: string = "hello,word";
    fs.write(fsOpen.fd, str, (err: BusinessError, writeLen: number) => {
      if (err) {
        console.error("write data to file failed with error message:" + err.message + ", error code: " + err.code);
      } else {
        promptAction.showToast({ message: '成功写入',duration:2000,alignment:Alignment.Center })
        console.info("成功写入大小为:" + writeLen);
      }
      fs.closeSync(fsOpen);
    });
  }
4.完整代码

封装成工具类了这里已经,直接拿着就能用

import { BusinessError } from '@kit.BasicServicesKit';
import fs, { ReadOptions, WriteOptions } from '@ohos.file.fs'; // 导入文件管理模块
import { buffer } from '@kit.ArkTS';
import { promptAction } from '@kit.ArkUI';
import { picker } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';

//执行UDP通讯的对象
export class fileUtils {
  async getFiles() {
    try {
      // 若文件不存在则创建文件
      const fsOpen = await fs.open('/storage/Users/currentUser/Download/jrdl.json',fs.OpenMode.READ_WRITE | fs.OpenMode.READ_ONLY |fs.OpenMode.CREATE|fs.OpenMode.TRUNC)
      // // 读取文件
      this.readFile(fsOpen)
      // this.deleteFile(fsOpen)
      // 写入
      this.writeFile(fsOpen)

    } catch (e) {
      console.error(`Invoke documentViewPicker.save failed, code is ${e.code}, message is ${e.message}`);
    }
  }

  readFile(fsOpen:fs.File){
    // 读取文件
    let arrayBuffer = new ArrayBuffer(4096);
    fs.read(fsOpen.fd, arrayBuffer, (err: BusinessError, readLen: number) => {
      if (err) {
        console.error("read failed with error message: " + err.message + ", error code: " + err.code);
      } else {
        console.info("read file data succeed");
        let buf = buffer.from(arrayBuffer, 0, readLen);
        console.info(`成功读取文件内容: ${buf.toString()}`);
      }
      // fs.closeSync(fsOpen);
    });
  }
  writeFile(fsOpen:fs.File){
    let str: string = "hello,word";
    fs.write(fsOpen.fd, str, (err: BusinessError, writeLen: number) => {
      if (err) {
        console.error("write data to file failed with error message:" + err.message + ", error code: " + err.code);
      } else {
        promptAction.showToast({ message: '成功写入',duration:2000,alignment:Alignment.Center })
        console.info("成功写入大小为:" + writeLen);
      }
      fs.closeSync(fsOpen);
    });
  }
  deleteFile(){
    fs.unlink('/storage/Users/currentUser/Download/jrdl.json').then(() => {
      console.info("remove file succeed");
    }).catch((err: BusinessError) => {
      console.error("remove file failed with error message: " + err.message + ", error code: " + err.code);
    });
  }
}

5.调用

  new fileUtils().getFiles()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中实现单例全局配置的读取写入可以通过以下步骤实现: 1. 首先,创建一个GlobalConfig类作为单例类,该类负责全局配置的读取写入。 ```cpp class GlobalConfig { public: static GlobalConfig* getInstance(); void readConfig(QString filePath); void writeConfig(QString filePath); private: static GlobalConfig* instance; GlobalConfig(); QString configValue; }; ``` 2. 实现GlobalConfig类的单例模式。在GlobalConfig的构造函数中,初始化configValue为空字符串,并在getInstance()方法中实现单例模式。 ```cpp GlobalConfig* GlobalConfig::instance = nullptr; GlobalConfig* GlobalConfig::getInstance() { if (instance == nullptr) { instance = new GlobalConfig(); } return instance; } GlobalConfig::GlobalConfig() { configValue = ""; } ``` 3. 实现GlobalConfig类中的读取写入配置方法。通过readConfig()方法从指定文件路径读取配置值,通过writeConfig()方法将配置值写入到指定文件路径中。 ```cpp void GlobalConfig::readConfig(QString filePath) { QFile configFile(filePath); if (configFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&configFile); configValue = in.readAll(); configFile.close(); } } void GlobalConfig::writeConfig(QString filePath) { QFile configFile(filePath); if (configFile.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&configFile); out << configValue; configFile.close(); } } ``` 4. 在其他地方使用全局配置的时候,可以通过GlobalConfig::getInstance()获取全局配置实例,并使用readConfig()和writeConfig()方法读取写入配置。 ```cpp QString filePath = "config.ini"; GlobalConfig* config = GlobalConfig::getInstance(); config->readConfig(filePath); // 读取配置值 QString configValue = config->getConfigValue(); // 修改配置值 config->setConfigValue("new config value"); // 写入配置 config->writeConfig(filePath); ``` 以上就是在Qt中实现单例全局配置读取写入的步骤。首先创建一个单例的GlobalConfig类,通过readConfig()和writeConfig()方法实现配置的读取写入。在其他需要使用全局配置的地方,通过GlobalConfig::getInstance()获取全局配置实例,并使用相关方法读取写入配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值