DEV Community

Cover image for You have been zigged (series) : Directory traversal part 2
Black Tornado
Black Tornado

Posted on

You have been zigged (series) : Directory traversal part 2

Lets continue building the last program. In here we will be using the std.Io.Dir.walk() function to do the job. This will print all file names including the one we kept inside a sub directory.

const std = @import("std");

pub fn main(init: std.process.Init) !void {
    const my_dir = std.Io.Dir.cwd().openDir(init.io, "./dir_enumerator", .{ .follow_symlinks = false, .iterate = true }) catch {
        try std.Io.File.writeStreamingAll(.stdout(), init.io, "Failed to open directory. Exiting...\n");
        std.process.exit(1);
    };
    defer my_dir.close(init.io);

    var stdout_buffer: [1024]u8 = undefined;
    var file_writer = std.Io.File.Writer.init(.stdout(), init.io, &stdout_buffer);
    var stdout_printer = &file_writer.interface;

    var walker = try std.Io.Dir.walk(my_dir, std.heap.page_allocator);
    defer walker.deinit();

    while (true) {
        const entry = try walker.next(init.io);
        if (entry == null) break;
        try stdout_printer.print("{s} - {any}\n", .{ entry.?.path, entry.?.kind });
    }
    try stdout_printer.flush();
}
Enter fullscreen mode Exit fullscreen mode
test1.txt - .file
test2.txt - .file
subdir - .directory
subdir/subdir_file.txt - .file
Enter fullscreen mode Exit fullscreen mode

Thanks for reading. To be continued.

Top comments (0)