HarmonyOS鸿蒙Next中如何将沙箱内文件排序展示

HarmonyOS鸿蒙Next中如何将沙箱内文件排序展示 已知应用沙箱内保存了多个word文档,在应用内一个页面要求可以对沙箱doc目录下的文档按修改时间倒序展示,请问应该如何开发?

9 回复

开发者你好,可以将沙箱内文件拉取出来之后,将数据初始化到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


实现步骤

  1. 获取沙箱目录下所有文件
  2. 读取文件修改时间
  3. 按修改时间倒序排序
  4. 页面列表展示

核心代码

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. 1. 获取沙箱目录路径 使用 getContext().filesDir 获取沙箱基础路径,拼接 doc 子目录路径:

    const context = this.getUIContext().getHostContext() as common.Context; const docDir = context.filesDir + '/doc'; // 沙箱内 doc 目录路径
    
  2. 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. 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. 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()方法按namelastModifiedTime等属性排序,再将排序后的数据绑定到ListGrid组件展示即可。示例:fileList.sort((a,b)=>a.name.localeCompare(b.name))

在 HarmonyOS Next 中实现沙箱内文档按修改时间倒序展示,核心步骤如下:

  1. 获取文件列表:使用 fileIo.listFile (或 file.listFile,根据 SDK 版本) 获取沙箱 doc 目录下所有文件名。
  2. 获取修改时间:遍历文件,通过 fileIo.stat 获取每个文件的 stat 对象,其中 mtime (修改时间) 字段即为排序依据。
  3. 排序:将文件名与对应的 mtime 组合成数组,按时间戳降序排序(可使用 Array.sort)。
  4. UI 展示:将排序后的文件列表绑定到 ListGrid 组件,用 ForEach 渲染即可。

注意沙箱路径通常由 context.filesDircontext.documentDir 获取,确保有正确的文件访问权限。整个逻辑建议放在 aboutToAppear 或页面初始化生命周期中异步执行,避免阻塞 UI。

回到顶部