File System

We can use std.Io.Dir to access the file system.

List files

We’ll start with a program that lists the files in a directory:

const std = @import("std");
const print = std.debug.print;

pub fn main(init: std.process.Init) !void {
    const io = init.io;

    // std.Io.Dir.cwd gives us the current working
    // directory.
    const cwd = std.Io.Dir.cwd();
    const dir = try cwd.openDir(io, "testdata", .{
        .iterate = true,
    });
    defer dir.close(io);

    var it = dir.iterate();
    while (try it.next(io)) |entry|
        print("{s}\n", .{entry.name});
}
$ mkdir testdata
$ touch testdata/cat
$ touch testdata/dog
$ touch testdata/elephant
$ zig run file.zig
dog
cat
elephant

Modify directories

Let’s take a look at how to modify directories in the file system:

const std = @import("std");

pub fn main(init: std.process.Init) !void {
    const io = init.io;

    const cwd = std.Io.Dir.cwd();
    const dir = try cwd.openDir(io, "testdata", .{});
    defer dir.close(io);

    try dir.createDir(io, "cat", .default_dir);
    try dir.createDir(io, "dog", .default_dir);
    try dir.createDir(io, "lynx", .default_dir);

    try dir.rename("cat", dir, "wildcat", io);

    try dir.deleteDir(io, "dog");
}
$ mkdir testdata
$ zig run file-2.zig 
$ tree testdata
testdata
├── lynx
└── wildcat

3 directories, 0 files

Modify files

Finally, we’ll mess with some files.

const std = @import("std");
const print = std.debug.print;

pub fn main(init: std.process.Init) !void {
    const io = init.io;

    const cwd = std.Io.Dir.cwd();
    const dir = try cwd.openDir(io, "testdata", .{});
    defer dir.close(io);

    // statFile gives us a file’s status.
    const stat = try dir.statFile(io, "cat", .{});
    print("cat:\n", .{});
    print("kind: {t}\n", .{stat.kind});
    print("size: {Bi}\n", .{stat.size});

    try dir.rename("cat", dir, "wildcat", io);

    try dir.deleteFile(io, "dog");
}
$ mkdir testdata
$ echo meeow > testdata/cat
$ echo woof > testdata/dog
$ zig run file-3.zig 
cat:
kind: file
size: 6B
$ tree testdata
testdata
└── wildcat

1 directory, 1 file

Next example: Text I/O.