HarmonyOS 鸿蒙Next中怎么读取文件夹下其他文件内容

HarmonyOS 鸿蒙Next中怎么读取文件夹下其他文件内容 在平板的文件管理器中,手动把文件a.txt,b.txt,c.txt,d.txt放到指定文件夹下(这里指通过平板文件管理器能看到的文件夹),如何选择a.txt文件的同时 能获取到b、c、d文件夹路径并能读取到里面内容(abcd都在一个文件夹下),a通过picker选择,但bcd是通过a路径进行拼接得到,或者abcd都不通过选择器 通过固定路径 进行读取?或能否选择abcd所在文件夹,然后遍历读取abcd内容? 现在用picker只能读取选择的文件内容,遍历文件夹也只能得到文件名称。怎么实现固定路径下读取文件内容?

(实际应用中矢量数据的读取:矢量数据有多个文件,主文件 xxx.shp可通过选择进行获取路径,但其他文件都需要通过主文件路径来拼接得到,但拼接的文件路径无法读取)


更多关于HarmonyOS 鸿蒙Next中怎么读取文件夹下其他文件内容的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

可以考虑下另一个思路。先把你放数据的文件夹拷贝到应用沙箱中的缓存目录下,然后在应用沙箱中操作,不就不需要文件权限了吗?理论上应用对本应用沙箱目录具有完全控制权。用完后及时删除。缓存目录一般来说会自己清理删除。

更多关于HarmonyOS 鸿蒙Next中怎么读取文件夹下其他文件内容的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


做不了吧,你这个违背了鸿蒙的原生安全原则

我也遇到过要读矢量数据问题, 客户通过电脑连接平板或手机,把数据放一个固定文件下,软件读取后进行编辑,在选择一个主文件的同时,其他副文件也要选择并读取。如复制到沙箱里进行操作,操作完是需要导出,否则客户也拿不到修改后的数据,不可能每修改一处就导出一次,如果软件清理了缓存或系统重置升级等,那数据就丢失了。不知道能不能获取到永久权限,或者能通过app创建一个在文件管理器能看到的文件夹,这个app可以对这个文件夹进行任意增删?

在HarmonyOS NEXT中读取文件夹下文件内容,可使用@ohos.file.fs文件系统API。具体步骤:

  1. 获取文件目录句柄 fs.openSync(path)
  2. 读取目录内容 fs.listFile(directory)获取文件名列表;
  3. 遍历文件列表,使用fs.readSync(fileHandle)读取单个文件内容。

需注意:调用前需在module.json5中声明ohos.permission.FILE_ACCESS权限。

在HarmonyOS Next中读取文件夹下其他文件内容,可以通过以下方式实现:

  1. 使用固定路径读取:
import fileio from '@ohos.fileio';
import file from '@ohos.file.fs';

// 固定路径方式(需申请ohos.permission.READ_MEDIA权限)
let dirPath = "/storage/emulated/0/YourFolder/";
let fileNames = ['a.txt', 'b.txt', 'c.txt', 'd.txt'];

async function readFiles() {
  for (let fileName of fileNames) {
    let filePath = dirPath + fileName;
    try {
      let stream = fileio.createStreamSync(filePath, 'r');
      let content = await file.readText(stream.fd);
      console.log(`${fileName} content: ${content}`);
      fileio.close(stream);
    } catch (err) {
      console.error(`Read ${fileName} failed: ${err}`);
    }
  }
}
  1. 通过主文件路径推导其他文件:
import fileio from '@ohos.fileio';

// 当获取到主文件路径后(如a.txt)
let mainFilePath = "/storage/emulated/0/YourFolder/a.txt";
let dirPath = mainFilePath.substring(0, mainFilePath.lastIndexOf('/') + 1);

// 获取目录下所有文件
let dir = await fileio.opendir(dirPath);
let dirent = await dir.read();

while (dirent) {
  if (dirent.name !== '.' && dirent.name !== '..') {
    let filePath = dirPath + dirent.name;
    // 读取文件内容...
  }
  dirent = await dir.read();
}
  1. 对于.shp等特殊文件处理:
// 获取shp文件后自动推导相关文件
let shpPath = "/path/to/xxx.shp";
let basePath = shpPath.replace('.shp', '');

let requiredFiles = [
  `${basePath}.shp`,
  `${basePath}.shx`,
  `${basePath}.dbf`
  // 其他必要文件...
];

requiredFiles.forEach(async (filePath) => {
  // 检查并读取每个文件
});

注意:

  1. 需要申请文件读写权限
  2. 实际路径可能因设备/沙箱机制有所不同
  3. 对于媒体文件建议使用mediaLibrary API
  4. 文件操作建议放在异步任务中执行

以上方法可以解决矢量数据文件组读取问题,通过主文件路径推导出关联文件路径后进行统一处理。

回到顶部