HarmonyOS鸿蒙Next中如何将沙箱内文件排序展示
HarmonyOS鸿蒙Next中如何将沙箱内文件排序展示 已知应用沙箱内保存了多个word文档,在应用内一个页面要求可以对沙箱doc目录下的文档按修改时间倒序展示,请问应该如何开发?
开发者你好,可以将沙箱内文件拉取出来之后,将数据初始化到Array列表中,然后通过stat接口,来获取文件修改时间,然后通过this.array.sort将Array按照修改时间排序显示。
【背景知识】
- Class (Array):一种线性数据结构,底层基于数组实现,可以在ArkTS上并发实例间传递。
- sort:对ArkTS Array进行排序,并返回排序后的Array。
class fileData{
fileUri: string = ''
mTime:Date = new Date()
}
@Entry
@Component
struct ListSortPage{
@State array: fileData[] = [];
controller: Scroller = new Scroller();
@State isShowButton: boolean = true;
aboutToAppear(): void {
this.array = [{fileUri: '0', mTime: new Date('2024-11-24 12:00:00')}, {fileUri: '1', mTime: new Date('2024-11-23 13:00:20')}, {fileUri: '2', mTime: new Date('2024-11-22 14:00:40')}, {fileUri: '3', mTime: new Date('2024-11-25 15:00:50')}, {fileUri: '4', mTime: new Date('2024-11-26 16:10:00')}];
this.array.sort((a: fileData, b: fileData) => b.mTime.getTime() - a.mTime.getTime());
}
build() {
Column(){
List({ scroller: this.controller }) {
ForEach(this.array, (item: fileData) => {
ListItem() {
Column() {
Text('文件uri:' + item.fileUri)
.fontSize(20)
.width('40%')
Text('修改时间:' + item.mTime.getFullYear() + '-' + (item.mTime.getMonth() + 1) + '-' + item.mTime.getDate() + ' ' + item.mTime.getHours() + ':' + (item.mTime.getMinutes() < 10 ? '0' + item.mTime.getMinutes() : item.mTime.getMinutes()) + ':' + (item.mTime.getSeconds() < 10 ? '0' + item.mTime.getSeconds() : item.mTime.getSeconds()))
.fontSize(16)
Divider()
}
.width('100%')
}
.width('100%')
.height(100)
},(item: fileData) => item.fileUri)
}
.width('100%')
.height('100%')
if(this.isShowButton){
Button('新增')
.onClick(()=>{
this.array.push({fileUri: '5', mTime: new Date()});
this.array.sort((a: fileData, b: fileData) => b.mTime.getTime() - a.mTime.getTime());
this.isShowButton = false;
})
}
}
.width('100%')
.height('80%')
}
}
更多关于HarmonyOS鸿蒙Next中如何将沙箱内文件排序展示的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
实现步骤
- 获取沙箱目录下所有文件
- 读取文件修改时间
- 按修改时间倒序排序
- 页面列表展示
核心代码
ts
import { fileIo } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
// 获取沙箱doc目录
const context: common.Context = getContext(this);
const docDir = context.filesDir + '/doc/';
// 获取并排序文件(修改时间倒序)
async function getSortedFiles() {
// 1. 获取文件列表
let files = await fileIo.listFile(docDir);
let fileList = [];
// 2. 获取文件修改时间
for (let name of files) {
let path = docDir + name;
let stat = await fileIo.stat(path);
fileList.push({
name: name,
path: path,
mtime: stat.mtime // 修改时间戳
});
}
// 3. 倒序排序(最新在前)
fileList.sort((a, b) => b.mtime - a.mtime);
return fileList;
}
页面展示
ts
build() {
List() {
ForEach(this.fileList, (item) => {
ListItem() {
Text(item.name)
}
})
}
}
官方文档
有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html,
您的问题主要涉及到以下的技术点:
1、沙箱文件路径的获取。
2、文件列表获取及筛选。
3、文件修改时间的获取
4、数组排序,时间格式展示。
我写了一个简单的示例,希望对您有帮助,具体代码如下:
import fileIo from "@ohos.file.fs"
export interface FileInfo{
filePath:string,
time:number
}
@Entry
export struct TestFileModifyTime{
@State docInfos:Array<FileInfo> = []
aboutToAppear(): void {
try{
let filePath = this.getUIContext().getHostContext()?.filesDir+"/"+"docPath"
console.log(`${filePath}`)
let files = fileIo.listFileSync(filePath,{
//列出子文件夹下的文件
recursion:true,
filter:{
//由于mimeType暂不支持,采用后缀匹配的方式过滤
suffix:[".doc",".docx"]
}
})
let fileList:Array<FileInfo> = [];
files.forEach((file,index)=>{
//获取文件信息
let fileStat = fileIo.statSync(filePath+file);
let fileModifyTime = fileStat.mtime
let fileName = file.substring(1,file.length)
let fileInfo:FileInfo = {
"filePath":fileName,
"time":fileModifyTime
}
fileList.push(fileInfo)
})
//按照修改时间降序排序
this.docInfos = fileList.sort((a,b)=>b.time-a.time)
console.log(JSON.stringify(this.docInfos))
}catch (error){
let err = error as BusinessError
console.log(`读取文件异常,错误码:${err.code},错误信息:${err.message}`)
}
}
build() {
Column(){
Row() {
SymbolGlyph($r("sys.symbol.arrow_left")).onClick(() => {
this.getUIContext().getRouter().back()
})
}.width('100%').justifyContent(FlexAlign.Start)
Column(){
ForEach(this.docInfos,(docInfo:FileInfo,index)=>{
Row(){
Text(docInfo.filePath)
Blank()
Text(`修改时间:${this.formatTimestamp(docInfo.time)}`)
}.width('100%')
})
}.width('100%').layoutWeight(1).padding(15)
}.width('100%').height('100%')
}
formatTimestamp(timestamp: number): string {
const date = new Date(timestamp*1000)
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
const hours = String(date.getHours()).padStart(2, '0')
const minutes = String(date.getMinutes()).padStart(2, '0')
const seconds = String(date.getSeconds()).padStart(2, '0')
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}
}
获取沙箱文件列表,获取文件信息排序
鸿蒙的 fs.listFile 仅返回文件名数组,无法直接获取修改时间,需要使用 fs.stat 来获取文件的详细属性(包括修改时间)
在鸿蒙应用开发中,对沙箱内 doc 目录下的 Word 文档按修改时间倒序展示,可通过以下步骤实现:
-
1. 获取沙箱目录路径 使用
getContext().filesDir获取沙箱基础路径,拼接 doc 子目录路径:const context = this.getUIContext().getHostContext() as common.Context; const docDir = context.filesDir + '/doc'; // 沙箱内 doc 目录路径 -
2. 列出文件并过滤 Word 文档 通过
fs.listFiles获取目录下所有项目,结合过滤器筛选.doc/.docx文件:import { fileIo as fs } from '@kit.CoreFileKit'; // 列出 doc 目录下所有项目(不递归) const files = await fs.listFiles(docDir, { recursion: false, // 不递归子目录 filter: { suffix: ['.doc', '.docx'] } // 过滤 Word 文档 }); -
3. 获取文件信息并排序 遍历文件列表,使用
fs.stat获取修改时间,按时间倒序排序:const fileInfos = []; for (const fileName of files) { const filePath = `${docDir}/${fileName}`; const stat = await fs.stat(filePath); if (stat.isFile()) { // 确保是文件而非目录 fileInfos.push({ name: fileName, mtime: stat.mtime.getTime() // 获取时间戳 }); } } // 按修改时间倒序排序 fileInfos.sort((a, b) => b.mtime - a.mtime); -
4. UI 展示排序结果 将排序后的数据绑定到
List组件:@State sortedFiles: Array<{name: string, mtime: number}> = []; // 更新状态变量 this.sortedFiles = fileInfos; build() { List() { ForEach(this.sortedFiles, item => { ListItem() { Text(item.name).fontSize(16) Text(`最后修改: ${new Date(item.mtime).toLocaleString()}`).fontColor(Color.Gray) } }) } }
关键注意事项
-
路径合法性:操作前需确保
docDir存在(可通过fs.access检查路径)。 -
性能优化:文件较多时建议分页加载,避免主线程阻塞。
-
错误处理:添加
try/catch捕获可能的 I/O 异常。 -
权限声明:在
module.json5中声明文件读写权限:"requestPermissions": [ { "name": "ohos.permission.FILE_ACCESS_MANAGER" }, { "name": "ohos.permission.READ_MEDIA" } ]
补充说明
- 递归目录:若需包含子目录文件,设置
recursion: true(参考搜索结果 5)。 - 时间格式化:使用
new Date(stat.mtime).toLocaleString()可转换为本地时间格式。
在HarmonyOS Next中,使用@ohos.file.fs模块的listFile()获取沙箱内文件列表,返回FileInfo[]对象数组。通过数组的sort()方法按name或lastModifiedTime等属性排序,再将排序后的数据绑定到List或Grid组件展示即可。示例:fileList.sort((a,b)=>a.name.localeCompare(b.name))。


