【HarmonyOS鸿蒙Next】【ARKUI】【API8】【eTS】怎么读取一个不在应用文件夹下的TXT文件
【HarmonyOS鸿蒙Next】【ARKUI】【API8】【eTS】怎么读取一个不在应用文件夹下的TXT文件 最近有空想写一个阅读器自己用,顺带学习一下arkUI的使用,结果出师不利,倒在了第一步读取文件上。翻了Harmony,OpenHarmony的文档,各种尝试,卡了三天,想问问有谁有解决的办法吗?说说我自己尝试的几种思路。
-
首先尝试了ohos.document,这个接口只有两个方法,一个choose,一个show,只能返回选中文件的url,没啥用,更何况,文档还标注着 本模块接口后续将废弃。不建议使用以下接口,调用以下接口将抛出异常。直接放弃。
-
尝试使用了ohos.multimedia.mediaLibrary,这个接口确实不错,就是文档的示例太少了,还有错的地方,直接拷贝没用。比如说
selections: mediaLibrary.FileKey.MEDIA_TYPE + '= ? OR' +mediaLibrary.FileKey.MEDIA_TYPE + '= ?',
这个引号混用也就算了,可以查出来,结果OR后面少空格,编译也不报错,就是查不出结果,让我好难受。。。正确如下
selections: mediaLibrary.FileKey.MEDIA_TYPE + ' = ? OR ' +mediaLibrary.FileKey.MEDIA_TYPE + ' = ?',
最后还是有成果的,用这个接口可以成功读取出所有txt文件的文件名和路径,代码和效果如下
var mediaLibraryInstance = mediaLibrary.getMediaLibrary(); let fileFetchOp = { selections: mediaLibrary.FileKey.DISPLAY_NAME + ' LIKE ?', selectionArgs: ["%.txt"], order: mediaLibrary.FileKey.SIZE + " DESC" }; mediaLibraryInstance.getFileAssets(fileFetchOp).then(function(fetchFileResult){ console.log("getFileAssets successfully:" + fetchFileResult.getCount()); fetchFileResult.getAllObject((err, fileAssetList) => {
然后再没有然后了,这个接口还提供了一个open方法,返回的参数是文件句柄,显示打开了,然而没有方法读出文件的内容。
之后这个方法可以用作搜索本地文件。暂留。
-
最后尝试了ohos.fileio,专门用于文件读写的接口,看到里面有个fileio.readText我喜出望外,大概就是这个了。
然而现实给了我重重一击,模块上直接写着 使用该功能模块对文件/目录进行操作前,需要先获取其应用沙箱路径
尝试直接调用先试试
fileio.readText(fileAssetList[i].relativePath + fileAssetList[i].displayName).then(function(str) { console.info("readText succeed:" + str); }).catch(function(err){ console.info("readText failed with error:" + err); });
直接显示app Log: readText failed with error:Error: Invalid argument
根据我的理解,这个接口大概只能对应用里的文件进行读写,只能放弃了。
-
最后试了试ohos.data.dataAbility,简单试了试没啥用,再仔细看了看,DataAbilityHelper模块(JS端SDK接口),JS特供,估计eTS没戏,就没再试。
还有一个就是我只申请了一个权限ohos.permission.READ_MEDIA,其他的好像也不太合适。
最后,有哪位大佬看在我写了这么多字的分上,帮帮我吧。
更多关于【HarmonyOS鸿蒙Next】【ARKUI】【API8】【eTS】怎么读取一个不在应用文件夹下的TXT文件的实战教程也可以访问 https://www.itying.com/category-93-b0.html
可以使用mediaLibrary接口访问用户公共数据,如要读取或写入,将待读取/写入文件打开返回的fd作为fileio接口的入参去读取/写入内容,比如作为 fileio.readSync的入参。
fileio中接口入参为path时只能是从context获取到的本应用沙箱路径,若要访问其他路径的数据,如公共数据图片视频等,需要通过数据所有者打开文件返回fd进行操作。比如向mediaLibrary请求读取/写入某文件,然后通过打开代表特定文件的URI后返回的fd进行操作。
更多关于【HarmonyOS鸿蒙Next】【ARKUI】【API8】【eTS】怎么读取一个不在应用文件夹下的TXT文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
所以公共路径到底是哪个?
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17
该接口可以获取公共目录路径,不过只针对系统应用开发,
公共文件访问与控制接口:[https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-filemanager.md](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-filemanager.md)
我看了安卓的,确实没找到读写其他沙盒路径的方法,但是可以曲线救国,通过一个复制媒体文件的接口,把其他路径的文件复制到自己应用的沙盒路径下,再进行读写,
开发者您好,您的问题我们技术这边正在定位中,有消息了第一时间回复您
感谢🙏,麻烦啦。
顶一下,求个大佬回复,
我也问相同的问题。
在HarmonyOS鸿蒙Next中,使用ARKUI和eTS开发时,读取不在应用文件夹下的TXT文件可以通过@ohos.fileio
模块实现。首先,确保应用已经获取了相应的文件访问权限。然后,使用openSync
和readSync
方法读取文件内容。以下是一个示例代码:
import fileio from '@ohos.fileio';
let filePath = '你的文件路径'; // 替换为实际文件路径
let fd = fileio.openSync(filePath, 0o2); // 以只读方式打开文件
let buffer = new ArrayBuffer(1024); // 创建缓冲区
let readSize = fileio.readSync(fd, buffer); // 读取文件内容到缓冲区
let content = String.fromCharCode.apply(null, new Uint8Array(buffer.slice(0, readSize))); // 将缓冲区内容转换为字符串
fileio.closeSync(fd); // 关闭文件
这段代码会打开指定路径的文件,读取其内容并转换为字符串。确保文件路径正确且应用有权限访问该文件。
在HarmonyOS中,若需读取不在应用文件夹下的TXT文件,首先需申请相应权限,如ohos.permission.READ_USER_STORAGE
。然后,使用@ohos.file.fs
模块的openSync
和readSync
方法来打开并读取文件。确保文件路径正确,并处理可能出现的异常,如文件不存在或权限不足。读取后,使用closeSync
关闭文件以释放资源。