如何在Zig中遍历指定路径的文件和目录且不包含子目录
问题描述
我尝试了以下Zig代码,它会遍历当前路径下的所有文件、目录及子目录,但我不需要遍历子目录。我尝试调整实现方式,却发现如果不传入.iterate = true就无法进行遍历,请问该如何实现需求?
const std = @import("std"); pub fn main() !void { const path = "."; const allocator = std.heap.page_allocator; var dir = try std.fs.cwd().openDir(path, .{ .iterate = true }); defer dir.close(); var walker = try dir.walk(allocator); defer walker.deinit(); std.debug.print("\n", .{}); while (try walker.next()) |entry| { std.debug.print("File Name: {s}\n", .{entry.basename}); } }
解决方案
你不需要使用walk方法(它的核心作用就是递归遍历所有子目录),改用Dir.iterate()方法即可仅遍历当前目录的内容。openDir时传入.iterate = true是启用目录迭代功能的必要参数,和是否递归遍历无关。
修改后的代码如下:
const std = @import("std"); pub fn main() !void { const path = "."; var dir = try std.fs.cwd().openDir(path, .{ .iterate = true }); defer dir.close(); // 使用 iterate 而非 walk,仅遍历当前目录下的直接条目 var iterator = dir.iterate(); while (try iterator.next()) |entry| { std.debug.print("File Name: {s}\n", .{entry.name}); } }
关键说明:
Dir.walk():递归遍历当前目录及其所有子目录下的所有条目,适合深度遍历场景。Dir.iterate():仅遍历当前目录下的直接条目(文件、子目录、符号链接等),不会进入子目录,完全匹配你的需求。.iterate = true:这是打开目录时启用迭代功能的必填参数,无论使用walk还是iterate都需要设置,否则无法获取目录条目。
内容的提问来源于stack exchange,提问作者prashanthsp
相关产品推荐
相关产品推荐

