HarmonyOS 鸿蒙Next怎么读取文件数据

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

HarmonyOS 鸿蒙Next怎么读取文件数据
<markdown _ngcontent-vaf-c237="" class="markdownPreContainer">

最近在学如何操作文件,在用官方的文件管理模块import fs from '@ohos.file.fs’中fs.read()时,没搞清楚这个数据是怎传递的。目的是为了获得文件的数据。我从官方给出的文档推断,这个fs.read()读取的文件数据就储存当作参数传入的buffer里面,但是我打印出来看啥都没有。那这个读出来数据存到哪里去了?

函数解释:

传入参数:

file_uri_or_path 文件沙箱路径或者uri

两个callback函数,用来将获得的array buffer或者由array buffer组成的数组传出去。

执行逻辑

fs.open()接受file_uri_or_path,打开文件,.then()里获取File类型的数据,然后获得该文件的文件描述符fd。

用fd传入fs.statSync()读取文件属性,获得文件大小,用这个大小数据构建arraybuffer类变量buffer,传入fs.read()。根据我的理解,.then()后数据此时存在变量buffer里面,于是对buffer操作,如果buffer大于1024字节则进行分割,加到一个数组里,把数组传出去,不足1024字节则直接把buffer传出去。

function get_file_buffer(
file_uri_or_path:string,
callback_for_buffer_array:Function=()=>{},
callback_for_buffer:Function=()=>{}){
  fs.open(
  file_uri_or_path,
  fs.OpenMode.READ_ONLY|fs.OpenMode.CREATE
  ).then(
  (file:fs.File)=>{
    let file_size=fs.statSync(file.fd).size;
    let buffer:ArrayBuffer=new ArrayBuffer(file_size)
    fs.read(file.fd,buffer).then(
    ()=>{
      if (file_size>1024){
        let int_to_1024:number=(file_size-file_size%1024)/1024
        let natural_array:number[]=Array.from({length: int_to_1024}, 
        (val, i) => +i)
        let buffer_slice_array:ArrayBuffer[]
        for (let index = 0; index < natural_array.length; index++) {
          const element = natural_array[index];
          buffer_slice_array.push(buffer.slice(1024*element,1024*(element+1)))
        }
        buffer_slice_array.push(buffer.slice(file_size-file_size%1024))
        callback_for_buffer_array(buffer_slice_array)
        callback_for_buffer(new ArrayBuffer(0))
      }else {callback_for_buffer(buffer);callback_for_buffer_array([])}
    }).catch(
    (err)=>{
    Prompt.showDialog({message:JSON.stringify(err)+'failed to read file'})
    })
  }).catch(
 (err)=>{
 Prompt.showToast({message:JSON.stringify(err)+'failed to open file'})
 })
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

经过测试,这个函数fs.open()执行正常,fs.statSync()执行正常,fs.read().then()能进入判断分支,然后就不行了。所以buffer实际上应该没有存数据,那么数据存哪里去了?

</markdown>

关于HarmonyOS 鸿蒙Next怎么读取文件数据的问题,您也可以访问:https://www.itying.com/category-93-b0.html 联系官网客服。
回到顶部