Como Criar Diretórios em Zig

Como Criar Diretórios em Zig

Criar diretórios é uma operação essencial para organizar arquivos, preparar ambientes de execução e estruturar projetos. Zig oferece funções na biblioteca padrão para criação de diretórios simples e aninhados.

Criar Diretório Simples

const std = @import("std");

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();

    // Criar um diretório
    try std.fs.cwd().makeDir("meu_diretorio");
    try stdout.print("Diretório 'meu_diretorio' criado!\n", .{});
}

Criar Diretórios Aninhados (Recursivo)

Use makePath para criar toda a cadeia de diretórios de uma vez.

const std = @import("std");

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();

    // Criar diretórios aninhados de uma vez
    try std.fs.cwd().makePath("projeto/src/modulos/util");
    try stdout.print("Caminho 'projeto/src/modulos/util' criado!\n", .{});

    // Criar outra estrutura
    try std.fs.cwd().makePath("projeto/tests/integracao");
    try stdout.print("Caminho 'projeto/tests/integracao' criado!\n", .{});

    try std.fs.cwd().makePath("projeto/docs/api");
    try stdout.print("Caminho 'projeto/docs/api' criado!\n", .{});
}

Tratar Erro de Diretório Existente

const std = @import("std");

fn criarDiretorioSeguro(caminho: []const u8) !void {
    std.fs.cwd().makeDir(caminho) catch |err| {
        switch (err) {
            error.PathAlreadyExists => {
                // Diretório já existe, tudo bem
                return;
            },
            else => return err,
        }
    };
}

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();

    // Criar diretório (seguro se já existir)
    try criarDiretorioSeguro("minha_pasta");
    try stdout.print("Diretório garantido: 'minha_pasta'\n", .{});

    // Chamar novamente não causa erro
    try criarDiretorioSeguro("minha_pasta");
    try stdout.print("Chamado novamente sem erro\n", .{});
}

Criar Diretório com Caminho Absoluto

const std = @import("std");

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();

    // Criar diretório em caminho absoluto
    try std.fs.makeDirAbsolute("/tmp/zig_teste");
    try stdout.print("Diretório criado em /tmp/zig_teste\n", .{});

    // Criar caminho aninhado absoluto
    try std.fs.makeDirAbsolute("/tmp/zig_teste/sub1");
    try stdout.print("Subdiretório criado\n", .{});
}

Exemplo Prático: Criar Estrutura de Projeto

const std = @import("std");

fn criarEstruturaProjeto(nome: []const u8) !void {
    const cwd = std.fs.cwd();

    const diretorios = [_][]const u8{
        "src",
        "src/models",
        "src/controllers",
        "src/views",
        "tests",
        "tests/unit",
        "tests/integration",
        "docs",
        "config",
        "scripts",
    };

    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();
    const allocator = gpa.allocator();

    for (diretorios) |subdir| {
        const caminho = try std.fmt.allocPrint(allocator, "{s}/{s}", .{ nome, subdir });
        defer allocator.free(caminho);
        try cwd.makePath(caminho);
    }
}

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();

    try criarEstruturaProjeto("meu-app");
    try stdout.print("Estrutura do projeto 'meu-app' criada!\n", .{});

    // Verificar listando
    var dir = try std.fs.cwd().openDir("meu-app", .{ .iterate = true });
    defer dir.close();

    var iter = dir.iterate();
    try stdout.print("\nConteúdo de 'meu-app/':\n", .{});
    while (try iter.next()) |entrada| {
        try stdout.print("  {s}/\n", .{entrada.name});
    }
}

Criar Diretório Temporário

const std = @import("std");

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();

    // Criar diretório temporário
    var tmp_dir = std.testing.tmpDir(.{});
    defer tmp_dir.cleanup();

    // Criar subdiretórios dentro do temporário
    try tmp_dir.dir.makePath("dados/cache");

    // Criar um arquivo dentro
    const arquivo = try tmp_dir.dir.createFile("dados/teste.txt", .{});
    defer arquivo.close();
    try arquivo.writeAll("Conteúdo temporário\n");

    try stdout.print("Diretório temporário criado e utilizado com sucesso!\n", .{});
}

Veja Também

Continue aprendendo Zig

Explore mais tutoriais e artigos em português para dominar a linguagem Zig.