You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vala语言实现遍历文件夹及子文件夹内容并显示于TreeView

实现递归遍历嵌套目录的思路与代码修改

嗨,要实现遍历所有嵌套子文件夹的需求,核心就是递归遍历目录——当代码遇到子文件夹时,重复执行你当前的目录读取逻辑就行。下面是具体的实现思路和修改后的代码:

核心思路

  • 把目录遍历的逻辑封装成一个独立函数,方便递归调用
  • 遍历目录内的每个条目时,增加判断:
    • 如果是普通文件:直接添加到你的list_store中
    • 如果是子目录:递归调用封装好的遍历函数,传入子目录的路径
  • 保持原有的异常处理逻辑,递归过程中也要捕获文件操作的错误

修改后的代码

void populate_tree_view(GtkListStore *list_store, const gchar *directory) {
    try {
        Dir dir = Dir.open(directory, 0);
        string? name = null;
        while ((name = dir.read_name()) != null) {
            string path = Path.build_filename(directory, name);
            if (FileUtils.test(path, FileTest.IS_REGULAR)) {
                // 处理普通文件,添加到list_store
                list_store.append(out iter);
                list_store.set(iter, 0, name);
            } else if (FileUtils.test(path, FileTest.IS_DIR)) {
                // 遇到子目录,递归遍历
                populate_tree_view(list_store, path);
            }
        }
    } catch (FileError err) {
        stderr.printf("Error accessing directory %s: %s\n", directory, err.message);
    }
}

// 调用示例
GtkListStore *list_store = ...; // 你的list_store初始化代码
populate_tree_view(list_store, "/home/malte/.password-store/");

关键点说明

  1. 函数封装:把遍历逻辑抽成populate_tree_view函数,接收list_store和目标目录路径作为参数,这样递归时能持续往同一个列表存储里添加内容
  2. 目录判断:新增FileTest.IS_DIR的判断,一旦检测到子目录就递归调用自身,深入下一层目录
  3. 错误优化:在异常输出里加上了目录路径,方便定位哪个目录出了问题

这样修改后,代码就能自动遍历所有嵌套的子文件夹,把所有普通文件都添加到你的TreeView对应的list_store里了。

内容的提问来源于stack exchange,提问作者beli3ver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:37:44