首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
HarmonyOS
发新帖
0
0
[原创]【FAQ】HarmonyOS SDK 闭源开放能力 — Core File Kit
发表于: 2026-2-26 16:18
6693
[原创]【FAQ】HarmonyOS SDK 闭源开放能力 — Core File Kit
HarmonyOS SDK
2026-2-26 16:18
6693
#### 1.问题描述: 开发调试阶段经常需要在沙箱路径下构造测试文件,然后使用fs进行文件操作,有什么方法可快速在沙箱路径下构造文件吗? #### 解决方案: 开发者可以手动在<module-name>\resource路径下创建resfile目录,支持创建多层子目录,子目录名称可以自定义,文件夹内可以自由放置各类资源文件。 目录中的资源文件会被直接打包进应用,不经过编译,也不会分配资源ID。应用安装后,resfile资源会被解压到应用沙箱路径,通过Context属性resourceDir获取到resfile资源目录后,可通过文件路径访问,且该路径仅能以只读方式访问。 <mark class="encrypted">e1cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3k6r3!0U0i4K6u0r3K9r3q4J5L8h3!0F1P5h3!0K6i4K6u0V1k6%4g2A6k6r3g2K6i4K6u0r3M7X3g2K6L8%4g2J5j5$3g2Q4x3X3c8U0j5i4c8W2k6$3!0J5K9h3g2K6i4K6u0V1j5h3&6V1i4K6u0V1j5h3y4U0k6i4y4K6i4K6t1K6i4K6t1#2c8e0S2Q4x3U0g2n7y4g2)9J5y4e0R3@1i4K6t1#2c8e0k6Q4x3U0g2n7b7g2)9J5y4e0V1H3i4K6t1#2c8e0g2Q4x3U0f1^5z5q4)9J5y4e0R3$3i4K6t1#2c8e0N6Q4x3U0g2n7x3g2)9J5y4f1u0n7</mark> <mark class="encrypted">fc5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3k6r3!0U0i4K6u0r3K9r3q4J5L8h3!0F1P5h3!0K6i4K6u0V1M7X3g2X3k6i4u0W2L8X3y4W2M7#2)9J5c8X3A6K6i4K6u0V1j5i4m8A6M7#2)9J5k6r3W2F1L8X3g2J5i4K6u0V1j5i4m8H3L8r3W2U0j5i4c8A6L8$3&6Q4x3X3c8U0L8$3&6@1k6i4S2@1i4K6t1K6i4K6t1#2c8e0g2Q4x3U0g2n7x3g2)9J5y4e0W2q4i4K6t1#2c8e0k6Q4x3U0f1^5x3q4)9J5y4f1p5%4</mark> #### 2.问题描述: 如何在用picker选择整个文件夹的文件? #### 解决方案: 对于PC/2in1/TV设备可以通过DocumentSelectMode设置文件夹模式,选择整个文件夹;对于非PC/2in1/TV设备当前只能通过用户进行批量选择文件。 #### 3.问题描述: 如何通过DocumentViewPicker保存文件夹? #### 解决方案: 1.<a href="elink@8a4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3k6r3!0U0i4K6u0r3K9r3q4J5L8h3!0F1P5h3!0K6i4K6u0V1M7X3g2X3k6i4u0W2L8X3y4W2M7#2)9J5c8X3A6K6i4K6u0V1j5i4m8A6M7#2)9J5k6r3k6A6L8r3g2Q4x3X3c8H3K9h3y4C8k6i4u0Q4x3U0y4K6j5i4k6W2">DocumentViewPicke.save</a>只能保存文件,不支持保存文件夹。 2.<a href="elink@43bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3k6r3!0U0i4K6u0r3K9r3q4J5L8h3!0F1P5h3!0K6i4K6u0V1M7X3g2X3k6i4u0W2L8X3y4W2M7#2)9J5c8X3A6K6i4K6u0V1j5i4m8A6M7#2)9J5k6r3k6A6L8r3g2Q4x3X3c8H3K9h3y4C8k6i4u0Q4x3U0y4K6k6h3I4W2j5%4b7`.">可以使用DocumentViewPicke.select</a>保存文件夹,设置documentSelectOptions.selectMode = picker.DocumentSelectMode.FOLDER,拉起FilePicker应用界面后选择需要保存的公共目录,然后应用在公共目录中创建需要保存的文件夹即可。示例代码如下: ```TypeScript import { common } from '@kit.AbilityKit'; import { fileIo as fs, fileUri, picker } from '@kit.CoreFileKit'; import { BusinessError } from '@kit.BasicServicesKit'; @Entry @Component struct Index { context = this.getUIContext().getHostContext() as common.UIAbilityContext; @State fileName: string = 'startIcon.png'; saveFileToSandbox(fileName: string) { const filePath = this.context.cacheDir + '/' + fileName; const file = fs.openSync(filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE); const content = this.context.resourceManager.getRawFileContentSync(fileName); const arrayBuffer = content.buffer.slice(0); fs.writeSync(file.fd, arrayBuffer); fs.closeSync(file.fd); } build() { Column({ space: 20 }) { Button('在公共目录下保存test文件夹,并将rawfile中的文件保存到test文件夹中') .onClick(() => { this.saveFileToSandbox(this.fileName); const documentSelectOptions = new picker.DocumentSelectOptions(); let context = this.getUIContext().getHostContext() as common.UIAbilityContext; documentSelectOptions.selectMode = picker.DocumentSelectMode.FOLDER; // 创建文件选择器实例 const documentViewPicker = new picker.DocumentViewPicker(context); documentViewPicker.select(documentSelectOptions).then((documentSelectResult: Array<string>) => { let folder = documentSelectResult[0] + '/test'; folder = new fileUri.FileUri(folder).path; console.info(folder); fs.mkdirSync(folder); let fileDir = context.filesDir; let filePath = fileDir + '/' + this.fileName; let sandboxFile = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); let copyFilePath = folder + '/' + this.fileName; let copyFile = fs.openSync(copyFilePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); fs.copyFileSync(sandboxFile.fd, copyFile.fd); fs.close(sandboxFile); fs.close(copyFile); }).catch((err: BusinessError) => { console.error(`Invoke documentViewPicker.select failed, code is ${err.code}, message is ${err.message}`); }); }); } .height('100%') .width('100%'); } } ``` #### 4.问题描述: 如何找到应用数据对应的路径? #### 解决方案: <a href="elink@6abK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2Z5N6h3q4%4k6h3W2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3&6K6N6h3#2W2M7W2)9J5c8X3y4F1i4K6u0r3k6r3!0U0i4K6u0r3K9r3q4J5L8h3!0F1P5h3!0K6i4K6u0V1k6%4g2A6k6r3g2K6i4K6u0r3j5i4m8H3i4K6u0V1M7$3q4F1k6r3u0G2P5q4)9J5k6r3c8A6M7X3g2U0N6r3!0J5P5g2)9J5x3#2!0q4y4g2!0n7b7g2)9&6y4q4!0q4y4#2)9&6y4q4!0m8z5q4!0q4y4W2!0n7x3W2)9&6z5g2!0q4y4#2!0m8c8g2!0n7x3g2!0q4z5q4!0n7y4#2!0m8c8W2!0q4y4g2!0n7c8g2)9^5y4q4!0q4y4g2)9&6x3W2)9^5b7#2!0q4y4#2)9&6b7#2)9&6c8W2!0q4y4g2!0m8c8g2)9&6c8g2!0q4y4#2)9^5z5g2!0m8z5g2!0q4y4#2)9&6x3q4)9^5y4W2!0q4z5q4!0n7y4#2!0m8c8W2!0q4y4g2!0n7c8g2)9^5y4q4!0q4y4#2)9&6b7g2)9^5y4q4!0q4y4g2!0m8c8W2!0n7z5g2!0q4y4g2!0n7b7g2)9&6y4q4!0q4y4g2)9^5y4g2!0n7x3#2!0q4y4#2!0n7x3#2!0n7b7R3`.`.">应用沙箱路径和真实物理路径的对应关系</a>:在应用沙箱路径下读写文件,经过映射转换,实际读写的是真实物理路径中的应用文件。 沙箱路径/data/storage/el2/base/files/映射到物理路径:/data/app/el2/[用户ID]/base/[包名]/files/,直接通过访问applicationContext下的filesDir。 #### 5.问题描述: 使用readTextSync读取186M大文件,会直接出现crash。 #### 解决方案 如果读取的是内容比较多的文本文件,可以使用fs.readLines逐行读取的方式(只支持读取UTF-8文本文件),fs.readLines类似于fs.readText,但是一次只读取文本文件当中的一行,适合处理大文本文件。或者采用fs.read设置缓冲缓冲区,循环读取,逐步拼接成完成内容,代码案例参考如下: ```TypeScript import fs from '@ohos.file.fs'; import { common } from '@kit.AbilityKit'; import { buffer } from '@kit.ArkTS'; @Entry @Component struct Index { build() { Column() { Button('fs.readLine') .onClick(() => { let context = this.getUIContext().getHostContext() as common.UIAbilityContext let filePath = context.filesDir + '/test.txt' let readerIterator = fs.readLinesSync(filePath); for (let it = readerIterator.next();!it.done; it = readerIterator.next()) { console.info('content: ' + it.value); } }) Button('fs.read') .onClick(() => { let context = this.getUIContext().getHostContext() as common.UIAbilityContext let filePath = context.filesDir + '/test.txt' let file = fs.openSync(filePath, fs.OpenMode.READ_ONLY) let arrayBuffer = new ArrayBuffer(1024); let content = ''; let readLen = 0; do { readLen = fs.readSync(file.fd, arrayBuffer); content += buffer.from(arrayBuffer, 0, readLen).toString(); } while (readLen > 0); console.info(content) }) } } } ``` </string></module-name>
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
收藏
・
0
点赞
・
0
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
1
)
mb_eekvgidg
雪 币:
249
活跃值:
(175)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
28
粉丝
0
关注
私信
mb_eekvgidg
2
楼
很有内涵,能联系我吗137334010(企鹅
2026-4-7 18:59
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
HarmonyOS SDK
258
发帖
190
回帖
0
RANK
关注
私信
他的文章
[原创]HarmonyOS智慧多窗,让应用在任意窗口都“恰到好处”
271
[原创]AI 赋能 Push Kit 场景化消息开发,高效完成鸿蒙应用推送能力接入
472
[原创]HarmonyOS Push Kit 自分类权益 Skill,助力提升权益申请通过率
521
[原创]基于增强QUIC协议优化弱网下的直播观看体验
697
[原创]焕新鸿蒙应用权限管理方案,应用授权体验再升级
609
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部