我正在从 [this site](https://ziglearn.org/chapter-2/) 学习 zig。我在安装了 wsl2 的 Windows 上。这是之字形版本:
$ 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);
}
cleanup行执行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
可能是什么问题?该示例是从学习资源中 1 对 1 复制的。它对我来说是独一无二的,还是对很多人都不起作用也是我想知道的(也许这个例子已经过时了)。
我试过的:我试过跑一下,不多说了。我也无法在网上找到任何关于“zig deleteTree 不工作”或“zig deleteTree EBUSY”的信息。
也许我应该提一下,我记得在测试失败后手动删除目录。
其实我现在才发现,试运行后目录是空的。这可能意味着 deleteTree 成功删除了内容。但是,我希望该目录也被删除,并且没有运行时错误。
注意:到目前为止,我使用的学习资源的其他测试效果很好。
这似乎是示例代码中的错误。它缺少
close()
对 iter_dir
的调用。像这样更新代码:
var iter_dir = try std.fs.cwd().openIterableDir(
"test-tmp",
.{},
);
defer {
iter_dir.close();
std.fs.cwd().deleteTree("test-tmp") catch unreachable;
}