1. 前言
- rawfile是鸿蒙项目中的放置资源文件夹,在该文件夹中,我们可以放图片、音乐、视频、文本等,都是可以的。
- 不过app访问,只能根据一个个的文件名来访问,如果想实现将整个rawfile文件夹下的文件全部拷贝到沙箱,就需要我们提前在rawfile文件夹下将全部文件打成一个压缩包。
- 通过zlib接口,将文件解压到沙箱目录。这便实现了拷贝流程。
2. 参考文档
3. 核心思路
- 点击 "获取沙箱目录路径":获取并显示应用沙箱目录路径
- 点击 "获取缓存目录路径":获取并显示应用缓存目录路径
- 点击 "获取 rawfile 目录的压缩文件":从 rawfile 目录读取 "rawfile.zip" 的文件描述符
- 点击 "拷贝压缩文件到缓存目录":将 rawfile 中的压缩文件通过流操作复制到缓存目录
- 点击 "将压缩文件解压到沙箱目录":将缓存目录中的压缩文件解压到沙箱目录,并关闭文件描述符
- 点击 "获取沙箱目录的文件列表":读取并显示沙箱目录下的所有文件名称
4. 核心代码
// 拷贝压缩文件到缓存目录
async copyCompressedFileToCacheDirectory() {
try {
let dest = fs.openSync(this.cacheDirectoryPath + "/rawfile.zip", fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE)
let bufsize = 4096
let buf = new ArrayBuffer(bufsize)
let off = 0, len = 0, readedLen = 0
/**
* 通过buffer将rawfile文件内容copy到沙箱路径
*/
while (len = fs.readSync(this.data!.fd, buf, { offset: this.data!.offset + off, length: bufsize })) {
readedLen += len
fs.writeSync(dest.fd, buf, { offset: off, length: len })
off = off + len
if ((this.data!.length - readedLen) < bufsize) {
bufsize = this.data!.length - readedLen
}
}
await fs.close(dest.fd)
} catch (e) {
console.log("拷贝失败" + e)
}
this.showAlertDialog("压缩文件拷贝成功")
}
// 将压缩文件解压到沙箱目录
async unzipCompressedFileToSandboxDirectory() {
// 对沙箱路径下的压缩文件进行解压
await zlib.decompressFile(this.cacheDirectoryPath + "/rawfile.zip", this.sandboxDirectoryPath)
await this.context.resourceManager.closeRawFd("rawfile.zip")
console.info("解压完成")
this.showAlertDialog("解压文件完成")
}
5. 运行效果







6. 完整代码
Index.ets
import { fileIo as fs } from '@kit.CoreFileKit'
import { resourceManager } from '@kit.LocalizationKit'
import { zlib } from '@kit.BasicServicesKit'
@Entry
@ComponentV2
struct Index {
context = this.getUIContext().getHostContext()!
@Local sandboxDirectoryPath: string = ""
@Local cacheDirectoryPath: string = ""
@Local data: resourceManager.RawFileDescriptor | null = null
// 弹窗
showAlertDialog(mes: string) {
this.getUIContext().showAlertDialog({ message: mes })
}
// 获取沙箱目录路径
getSandboxDirectoryPath() {
this.sandboxDirectoryPath = this.context.filesDir
this.showAlertDialog("沙箱目录路径:" + this.sandboxDirectoryPath)
}
// 缓存目录路径
getCacheDirectoryPath() {
this.cacheDirectoryPath = this.context.cacheDir
this.showAlertDialog("缓存目录路径:" + this.cacheDirectoryPath)
}
// 获取rawfile目录的压缩文件
getCompressedFileFromRawfileDirectory() {
this.data = this.context.resourceManager.getRawFdSync("rawfile.zip")
this.showAlertDialog("压缩文件data获取成功")
}
// 拷贝压缩文件到缓存目录
async copyCompressedFileToCacheDirectory() {
try {
let dest = fs.openSync(this.cacheDirectoryPath + "/rawfile.zip", fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE)
let bufsize = 4096
let buf = new ArrayBuffer(bufsize)
let off = 0, len = 0, readedLen = 0
/**
* 通过buffer将rawfile文件内容copy到沙箱路径
*/
while (len = fs.readSync(this.data!.fd, buf, { offset: this.data!.offset + off, length: bufsize })) {
readedLen += len
fs.writeSync(dest.fd, buf, { offset: off, length: len })
off = off + len
if ((this.data!.length - readedLen) < bufsize) {
bufsize = this.data!.length - readedLen
}
}
await fs.close(dest.fd)
} catch (e) {
console.log("拷贝失败" + e)
}
this.showAlertDialog("压缩文件拷贝成功")
}
// 将压缩文件解压到沙箱目录
async unzipCompressedFileToSandboxDirectory() {
// 对沙箱路径下的压缩文件进行解压
await zlib.decompressFile(this.cacheDirectoryPath + "/rawfile.zip", this.sandboxDirectoryPath)
await this.context.resourceManager.closeRawFd("rawfile.zip")
console.info("解压完成")
this.showAlertDialog("解压文件完成")
}
// 获取沙箱目录的文件列表
getFileListInSandboxDirectory() {
let files = fs.listFileSync(this.sandboxDirectoryPath,);
this.showAlertDialog(files.join("\n"))
}
build() {
Column({ space: 100 }) {
Text("请依次点击下方按钮")
.fontSize(28)
.fontWeight(FontWeight.Bold)
Column({ space: 20 }) {
Text("沙箱目录路径:" + this.sandboxDirectoryPath)
Button("1、获取沙箱目录路径")
.onClick(() => {
this.getSandboxDirectoryPath()
})
Text("缓存目录路径:" + this.cacheDirectoryPath)
Button("2、获取缓存目录路径")
.onClick(() => {
this.getCacheDirectoryPath()
})
Text("压缩文件data长度:" + this.data?.length)
Button("3、获取rawfile目录的压缩文件")
.onClick(() => {
this.getCompressedFileFromRawfileDirectory()
})
Button("4、拷贝压缩文件到缓存目录")
.onClick(() => {
this.copyCompressedFileToCacheDirectory()
})
Button("5、将压缩文件解压到沙箱目录")
.onClick(() => {
this.unzipCompressedFileToSandboxDirectory()
})
Button("6、获取沙箱目录的文件列表")
.onClick(() => {
this.getFileListInSandboxDirectory()
})
}
}
.width("100%")
.height("100%")
.justifyContent(FlexAlign.Center)
}
}
觉得有帮助可以点赞或收藏