windows - Zig 的文件系统示例不适用于 Windows

标签 windows filesystems zig

我正在从[此站点](https://ziglearn.org/chapter-2/)学习zig。我在 Windows 上安装了 wsl2。这是 Zig 版本:

$ zig version
0.11.0-dev.2985+3f3b1a680

我使用 git bash 来处理这里提到的所有内容。

我在学习文件系统时遇到了问题。这个例子在我的机器上不起作用(CTRL+F“make dir”[此处](https://ziglearn.org/chapter-2/)找到它):

test "make dir" {
    try std.fs.cwd().makeDir("test-tmp");
    const iter_dir = try std.fs.cwd().openIterableDir(
        "test-tmp",
        .{},
    );
    defer {
        std.fs.cwd().deleteTree("test-tmp") catch unreachable;
    }

    _ = try iter_dir.dir.createFile("x", .{});
    _ = try iter_dir.dir.createFile("y", .{});
    _ = try iter_dir.dir.createFile("z", .{});

    var file_count: usize = 0;
    var iter = iter_dir.iterate();
    while (try iter.next()) |entry| {
        if (entry.kind == .File) file_count += 1;
    }

    try expect(file_count == 3);
}

清理行执行 catch unreachable,这意味着该行中的 deleteTree(...) 调用失败:

std.fs.cwd().deleteTree("test-tmp") catch unreachable;

这是我看到的错误。某处出现 EBUSY 错误。

C:\zig\zig-windows-x86_64-0.11.0-dev.2985+3f3b1a680\lib\std\os\windows.zig:935:31: 0x7ff656a5edc2 in DeleteFile (test.exe.obj)
        .SHARING_VIOLATION => return error.FileBusy,
                              ^
C:\zig\zig-windows-x86_64-0.11.0-dev.2985+3f3b1a680\lib\std\os.zig:2468:5: 0x7ff656a4c221 in unlinkatW (test.exe.obj)
    return windows.DeleteFile(sub_path_w, .{ .dir = dirfd, .remove_dir = remove_dir });
    ^
C:\zig\zig-windows-x86_64-0.11.0-dev.2985+3f3b1a680\lib\std\fs.zig:1914:25: 0x7ff656a18e0a in deleteDirW (test.exe.obj)
            else => |e| return e,
                        ^
C:\zig\zig-windows-x86_64-0.11.0-dev.2985+3f3b1a680\lib\std\fs.zig:1889:13: 0x7ff656a0c49e in deleteDir (test.exe.obj)
            return self.deleteDirW(sub_path_w.span());
            ^
C:\zig\zig-windows-x86_64-0.11.0-dev.2985+3f3b1a680\lib\std\fs.zig:2216:29: 0x7ff656a0377f in deleteTree (test.exe.obj)
                else => |e| return e,
                            ^
C:\Users\user\Documents\zigg\third-steps\src\stuff2.zig:74:51: 0x7ff656a02b77 in test.make dir (test.exe.obj)
        std.fs.cwd().deleteTree("test-tmp") catch unreachable;
                                                  ^
C:\zig\zig-windows-x86_64-0.11.0-dev.2985+3f3b1a680\lib\test_runner.zig:177:28: 0x7ff656a13b2e in mainTerminal (test.exe.obj)
        } else test_fn.func();
                           ^
C:\zig\zig-windows-x86_64-0.11.0-dev.2985+3f3b1a680\lib\test_runner.zig:37:28: 0x7ff656a04905 in main (test.exe.obj)
        return mainTerminal();
                           ^
C:\zig\zig-windows-x86_64-0.11.0-dev.2985+3f3b1a680\lib\std\start.zig:377:41: 0x7ff656a046a7 in WinStartup (test.exe.obj)
    std.debug.maybeEnableSegfaultHandler();
                                        ^
???:?:?: 0x7ffb3875269c in ??? (KERNEL32.DLL)
???:?:?: 0x7ffb39d8a9f7 in ??? (ntdll.dll)
error: the following test command failed with exit code 3:
C:\Users\user\Documents\zigg\third-steps\zig-cache\o\3d7c85ec680dad6ca22ab16356c3a336\test.exe

可能是什么问题?该示例是从学习资源中一对一复制的。它对我来说是独一无二的,还是对很多人不起作用也是我想知道的(也许这个例子已经过时了)。

我尝试过的:我尝试运行它,没什么可说的。我也无法在线找到有关“zig deleteTree not working”或“zig deleteTree EBUSY”的任何信息。
也许我应该提到,我记得在测试失败后手动删除该目录。

实际上,直到现在我才意识到,测试运行后该目录是空的。这可能意味着deleteTree 成功删除了内容。但是,我预计该目录也会被删除,并且不会出现运行时错误。

注意:来自the learning resource I use的其他测试到目前为止一切正常。

最佳答案

这似乎是示例代码中的一个错误。它缺少对 iter_dirclose() 调用。更新代码如下:

    var iter_dir = try std.fs.cwd().openIterableDir(
        "test-tmp",
        .{},
    );
    defer {
        iter_dir.close();
        std.fs.cwd().deleteTree("test-tmp") catch unreachable;
    }

关于windows - Zig 的文件系统示例不适用于 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76193031/

相关文章:

php - Symfony 不通过 touch( ) 创建文件

mysql - 删除从mysql创建的文件

windows - 使用 Zig 编译器构建 C 代码时如何包含 (msvc) libc

c - 绑定(bind)错误-Socket编程

c# - 如何让光盘在 DVD ROM 驱动器中保持旋转?

windows - 如何在不显示窗口的情况下运行 PowerShell 脚本?

windows - metro 应用程序中的 OnLaunched 事件和恢复事件有什么区别?

android - 什么是/storage/emulated/0/?

unreachable-code - 当程序在 ReleaseFast 上无法访问时会发生什么? (字郎)

整数和浮点类型的 zig maxValue