HarmonyOS 鸿蒙Next中选择文件后为什么读不到文件信息

HarmonyOS 鸿蒙Next中选择文件后为什么读不到文件信息

选择文件后为什么读不到文件信息

cke_288.png

cke_596.png


更多关于HarmonyOS 鸿蒙Next中选择文件后为什么读不到文件信息的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

【解决方案】

这边resolve里面是怎么实现的呢,这边是可以读取的,参考下示例代码:

import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
import { picker } from '@kit.CoreFileKit';
import { fileIo as fs } from '@kit.CoreFileKit';

@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
        Button('读取').onClick((event: ClickEvent) => {
          try {
            let context = getContext(this) as common.Context;
            let documentSelectOptions = new picker.DocumentSelectOptions();
            let documentPicker = new picker.DocumentViewPicker(context);
            documentPicker.select(documentSelectOptions).then((documentSelectResult: Array<string>) => {
              console.info('chen DocumentViewPicker.select successfully, documentSelectResult uri: ' +
              JSON.stringify(documentSelectResult));
              let uri: string = documentSelectResult[0];
              //这里需要注意接口权限参数是fs.OpenMode.READ_ONLY。
              let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
              console.info('tag file fd: ' + file.fd + 'url:' + file.path);
              let buffer = new ArrayBuffer(4096);
              let readLen = fs.readSync(file.fd, buffer);
              console.info('tag readSync data to file succeed and buffer size is:' + readLen);
              //读取完成后关闭fd。
              fs.closeSync(file);
            }).catch((err: BusinessError) => {
              console.error('DocumentViewPicker.select failed with err: ' + JSON.stringify(err));
            });
          } catch (error) {
            let err: BusinessError = error as BusinessError;
            console.error('DocumentViewPicker failed with err: ' + JSON.stringify(err));
          }
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next中选择文件后为什么读不到文件信息的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你好,tag readSync data to file succeed and buffer size is:4096,为什么读取的是let buffer = new ArrayBuffer(4096)设置的值,如果我想读取到这个文件内容该怎么做,

这边是需要读取pdf文件做展示吗?还是只需要读取该文件的字节?这边只是演示了一个字节的示例。

如果需要读取pdf做展示可以参考demo: https://developer.huawei.com/consumer/cn/doc/architecture-guides/import_pdf-0000002378274393

如果需要读取完整的字节数可以参考:

let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
let stat = fs.statSync(file.fd)
let buffer = new ArrayBuffer(stat.size);
let readLen = fs.readSync(file.fd, buffer);

好的,谢谢大佬,

在HarmonyOS Next中,选择文件后无法读取文件信息,通常是由于权限配置或URI解析问题导致。需检查应用是否已正确申请ohos.permission.READ_MEDIA权限,并在module.json5中声明。若使用Picker选择文件,需通过安全组件解包URI获取真实路径,直接使用返回的URI可能无法访问。另需确认文件选择器返回的URI是否有效,并使用FilePicker.getSecurePath方法解析路径。

在HarmonyOS Next中,选择文件后无法读取文件信息通常与权限配置或URI处理方式有关。首先检查是否在module.json5中正确声明了存储权限(如ohos.permission.READ_MEDIA),并确保在代码中动态申请了相关权限。其次,通过PhotoViewPickerDocumentViewPicker获取的URI需要使用FileHelperResourceManager进行解析,直接使用路径字符串可能导致访问失败。建议使用官方提供的fileIo接口处理URI,并确认目标文件未被加密或损坏。若问题持续,可检查系统日志获取详细错误信息。

回到顶部