HarmonyOS 鸿蒙Next怎么读取文件数据
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 联系官网客服。