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
- Listar Conteúdo de Diretório — Verifique o que foi criado
- Deletar Arquivos e Diretórios — Remova diretórios
- Escrever em Arquivo — Crie arquivos nos diretórios
- Manipulação de Caminhos — Construa caminhos programaticamente