以相反的顺序从Groovy的eachFile()返回文件列表

时间:2013-06-02 22:59:39

标签: groovy

我正在使用eachFile(),但我试图颠倒迭代发生的顺序。我怎么做?现在,它似乎对文件列表进行排序,然后按排序顺序处理每个文件。我基本上想要保留 - 对该列表进行排序并从最后开始。

3 个答案:

答案 0 :(得分:8)

我相信你不能改变eachFile()的顺序,但你可以达到预期的效果。

考虑:

new File("desired dir").listFiles().sort{ it.name }.reverse().each { def f ->
    println f.name
}

答案 1 :(得分:1)

您无法直接使用eachFile,但使用listFiles和手动排序执行此操作非常简单:

new File(path_to_file).listFiles().sort{a,b -> b.name <=> a.name}.each{ File f ->
    println f.name
}

这里的关键是被倒置的sort{}。 (如果您只在reverse()上使用listFiles(),则无法保证文件系统中的任何特定订单 - 文件可能是系统特定的订单。)

请注意,该类型是敏感 - 您可以像这样执行case- unsensitive 排序:

new File(path_to_file).listFiles().sort{a,b -> b.name.compareToIgnoreCase(a.name)}.each{ File f ->
    println f.name
}

在Groovy 2.1.3下测试。

答案 2 :(得分:1)

我知道最简单的方法是

def allFiles = new File('desired directory').listFiles()?.sort{a, b ->
    -(a.name <=> b.name)
}

eachFile无法在闭包中使用sort

明确使用sort的好处是您可以根据排序标准对文件进行排序。例如,根据文件的lastModified日期对文件进行排序: -

def allFiles = new File('desired directory').listFiles()?.sort{a, b ->
        a.lastModified() <=> b.lastModified()
        //to reverse sort on lastModified date use below
        //-(a.lastModified() <=> b.lastModified())
    }