← ziglang.inraylib-zigGitHub

directory files

★☆☆☆by Hugo ARNAL (@hugoarnal)

There is no browser build of this example yet.

Is it the same as C?

//! raylib [core] example - directory files
//!
//! Zig-API translation of examples/core/core_directory_files.c (raylib 6.2).
//! Example contributed by Hugo ARNAL (@hugoarnal) and reviewed by Ramon Santamaria (@raysan5)
//! Example licensed under an unmodified zlib/libpng license.
//! Copyright (c) 2025 Hugo ARNAL (@hugoarnal)

const std = @import("std");
const rl = @import("raylib");
const gui = @import("raygui");

const max_filepath_size = 1024;
const file_filter = "DIRS*;.png;.c";

/// Scroll/selection state of the file list view.
const ListState = struct {
    scroll_index: i32 = 0,
    item_active: i32 = -1,
    item_focused: i32 = -1,
};

/// Replace `files` with the filtered listing of `directory`.
fn reloadFiles(files: *rl.FilePathList, directory: *const [max_filepath_size:0]u8) void {
    rl.unloadDirectoryFiles(files.*);
    files.* = rl.loadDirectoryFilesEx(std.mem.sliceTo(directory, 0), file_filter, false);
}

pub fn main() void {
    // Initialization
    const screen_width = 800;
    const screen_height = 450;

    rl.initWindow(screen_width, screen_height, "raylib [core] example - directory files");
    defer rl.closeWindow(); // Close window and OpenGL context

    var directory: [max_filepath_size:0]u8 = @splat(0);
    _ = rl.textCopy(&directory, rl.getWorkingDirectory());

    // Load file-paths on current working directory
    // NOTE: loadDirectoryFiles() loads files and directories by default,
    // use loadDirectoryFilesEx() for custom filters and recursive directories loading
    var files = rl.loadDirectoryFilesEx(std.mem.sliceTo(&directory, 0), file_filter, false);
    defer rl.unloadDirectoryFiles(files);

    var btn_back_pressed = false;
    var list: ListState = .{};

    rl.setTargetFPS(60);

    // Main game loop
    while (!rl.windowShouldClose()) { // Detect window close button or ESC key
        // Update
        if (btn_back_pressed) {
            _ = rl.textCopy(&directory, rl.getPrevDirectoryPath(std.mem.sliceTo(&directory, 0)));
            reloadFiles(&files, &directory);
            list = .{};
        }

        const paths = files.slice();
        if (list.item_active >= 0 and list.item_active < paths.len) {
            const path = std.mem.span(paths[@intCast(list.item_active)]);
            if (rl.directoryExists(path)) {
                _ = rl.textCopy(&directory, path);
                reloadFiles(&files, &directory);
                list = .{};
            }
        }

        // Draw
        rl.beginDrawing();
        defer rl.endDrawing();

        rl.clearBackground(.ray_white);

        btn_back_pressed = gui.button(.{ .x = 40.0, .y = 10.0, .width = 48, .height = 28 }, "<") != 0;

        gui.setStyle(.default, gui.DefaultProperty.text_size, gui.getFont().baseSize * 2);
        _ = gui.label(.{ .x = 40 + 48 + 10, .y = 10, .width = 700, .height = 28 }, std.mem.sliceTo(&directory, 0));
        gui.setStyle(.default, gui.DefaultProperty.text_size, gui.getFont().baseSize);

        gui.setStyle(.listview, gui.ControlProperty.text_alignment, gui.TextAlignment.left);
        gui.setStyle(.listview, gui.ControlProperty.text_padding, 40);
        const screen_w: f32 = @floatFromInt(rl.getScreenWidth());
        const screen_h: f32 = @floatFromInt(rl.getScreenHeight());
        _ = gui.listViewEx(.{ .x = 0, .y = 50, .width = screen_w, .height = screen_h - 50 }, files.slice(), &list.scroll_index, &list.item_active, &list.item_focused);
    }
}
/*******************************************************************************************
*
*   raylib [core] example - directory files
*
*   Example complexity rating: [★☆☆☆] 1/4
*
*   Example originally created with raylib 5.5, last time updated with raylib 5.6
*
*   Example contributed by Hugo ARNAL (@hugoarnal) and reviewed by Ramon Santamaria (@raysan5)
*
*   Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
*   BSD-like license that allows static linking with closed source software
*
*   Copyright (c) 2025 Hugo ARNAL (@hugoarnal)
*
********************************************************************************************/

#include "raylib.h"

#define RAYGUI_IMPLEMENTATION
#include "raygui.h"                 // Required for GUI controls

#define MAX_FILEPATH_SIZE       1024
#define FILE_FILTER             "DIRS*;.png;.c"

//------------------------------------------------------------------------------------
// Program main entry point
//------------------------------------------------------------------------------------
int main(void)
{
    // Initialization
    //--------------------------------------------------------------------------------------
    const int screenWidth = 800;
    const int screenHeight = 450;

    InitWindow(screenWidth, screenHeight, "raylib [core] example - directory files");

    char directory[MAX_FILEPATH_SIZE] = { 0 };
    strcpy(directory, GetWorkingDirectory());

    // Load file-paths on current working directory
    // NOTE: LoadDirectoryFiles() loads files and directories by default,
    // use LoadDirectoryFilesEx() for custom filters and recursive directories loading
    //FilePathList files = LoadDirectoryFiles(directory);
    FilePathList files = LoadDirectoryFilesEx(directory, FILE_FILTER, false);

    int btnBackPressed = false;

    int listScrollIndex = 0;
    int listItemActive = -1;
    int listItemFocused = -1;

    SetTargetFPS(60);
    //--------------------------------------------------------------------------------------

    // Main game loop
    while (!WindowShouldClose())    // Detect window close button or ESC key
    {
        // Update
        //----------------------------------------------------------------------------------
        if (btnBackPressed)
        {
            TextCopy(directory, GetPrevDirectoryPath(directory));
            UnloadDirectoryFiles(files);
            files = LoadDirectoryFilesEx(directory, FILE_FILTER, false);

            listScrollIndex = 0;
            listItemActive = -1;
            listItemFocused = -1;
        }

        if ((listItemActive >= 0) && (listItemActive < (int)files.count) && DirectoryExists(files.paths[listItemActive]))
        {
            TextCopy(directory, files.paths[listItemActive]);
            UnloadDirectoryFiles(files);
            files = LoadDirectoryFilesEx(directory, FILE_FILTER, false);

            listScrollIndex = 0;
            listItemActive = -1;
            listItemFocused = -1;
        }
        //----------------------------------------------------------------------------------

        // Draw
        //----------------------------------------------------------------------------------
        BeginDrawing();
            ClearBackground(RAYWHITE);

            btnBackPressed = GuiButton((Rectangle){ 40.0f, 10.0f, 48, 28 }, "<");

            GuiSetStyle(DEFAULT, TEXT_SIZE, GuiGetFont().baseSize*2);
            GuiLabel((Rectangle){ 40 + 48 + 10, 10, 700, 28 }, directory);
            GuiSetStyle(DEFAULT, TEXT_SIZE, GuiGetFont().baseSize);

            GuiSetStyle(LISTVIEW, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
            GuiSetStyle(LISTVIEW, TEXT_PADDING, 40);
            GuiListViewEx((Rectangle){ 0, 50, (float)GetScreenWidth(), (float)GetScreenHeight() - 50 },
                files.paths, files.count, &listScrollIndex, &listItemActive, &listItemFocused);

        EndDrawing();
        //----------------------------------------------------------------------------------
    }

    // De-Initialization
    //--------------------------------------------------------------------------------------
    UnloadDirectoryFiles(files);

    CloseWindow();        // Close window and OpenGL context
    //--------------------------------------------------------------------------------------

    return 0;
}

From raylib 6.2. The original on GitHub.