我MmFile
在使用目录扫描算法时遇到了麻烦。
当我按如下方式对其进行压力测试时
foreach (dent; dirEntries(..)) {
const size_t K = ...;
const ulong size = ...;
scope auto mf = new MmFile(dent.name, MmFile.Mode.read, size, null, win)
}
在读取数据时,我找不到适用于所有情况的size
和的组合。win
当我设置
const size = 0;
const win = 64*1024;
长度计算正确。
但是当dent.name
是一个现有的空文件时,它会在销毁时MMFile
崩溃
core.exception.FinalizeError...std.exception.ErrnoException@std.mmfile.d(490): munmap failed (Invalid argument).
而且我无法通过捕获来恢复这个错误,core.exception.FinalizeError
因为它被抛出在析构函数中。我没试过
try { delete mm; } catch (core.exception.FinalizeError) { ; /* pass */}
也许这行得通。
这是mmap
在现有空文件上调用 C 时的默认行为吗?
如果是这样,我认为 MmFile 应该在构建过程中检查此错误。
当我scope
用明确的delete
.
现在我只是跳过调用MmFile
空文件。