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.