wallkength 的 dirEntries returns 没有文件

dirEntries with walklength returns no files

我正在使用 dirEntries。顺便说一句,功能很棒。我想在使用 foreach 之前测试文件的数量。我在这里查看堆栈溢出,建议的方法是使用 walkLength 函数 (Count files in directory with Dlang)。我接受了那个建议。它的 return 是一个非零值 - 太棒了。但是,foreach 不会迭代 dirEntries 的结果。它的作用就像 walkLength 已将 dirEntries 留在范围的末尾。有没有办法重置它,以便我可以从 dirEntries 列表的开头开始?这是一些示例代码:

auto dFiles = dirEntries("",filter, SpanMode.shallow);
if (walkLength(dFiles) > 0)
{
    writeln("Passed walkLength function");
    foreach (src; dFiles)
    {
        writeln("Inside foreach");
    }
}

输出显示它通过了 walkLength 函数,但从未进入 foreach 迭代器。

我是不是用错了dirEntries?正如有人建议的那样,我看过 Ali Cehreli 的好书 Programming in D。没有什么突出我。我在网上看过,但没有任何内容指向我对问题的解释。当然,我可能完全不了解真正的问题。

dirEntries 给你一个范围。您使用 walkLength 消耗该范围并到达终点。然后您尝试使用 foreach 循环从中读取更多条目。但是,您已经读完了,所以没有什么可读的了。

您可以重复 dirEntries 调用,使用 std.array 中的 array 函数将范围转换为数组,或者使用 .save 函数创建您传递给 walkLength.

的范围的副本

如果不关心长度,只关心是否为空,可以用范围的.empty 属性代替walkLength.