在Scala中搜索具有特定名称的文件夹

时间:2019-05-02 08:21:52

标签: scala io

有许多文件夹包含每日构建工件。我需要获取最新的文件夹来测试其中的某些部分。折叠的名称具有以下样式

xx.172-3 

xx是一个稳定的数字,可以忽略。 172是按时间顺序排列的第172个建筑。 3是172的第三个版本。文件夹名称的长度不一致。在34.120-11之前可能有34.99-0

/ test 路径下的典型文件夹是

   /test |-/34.170-0/ 
         |-/34.171-0/  
         |-/34.171-1/ 
         |-/34.172-0/
         |-/34.171-1/ 
         |-/34.171-2/
         |-/34.171-3/

问题:

如何使用Scala找到最新的构建文件夹 /34.171-3

注意:

我已经考虑过使用时间戳,但是它不起作用。因为在构建后可以自由访问以前的文件夹。时间戳不能告诉您它是否是最新版本

2 个答案:

答案 0 :(得分:3)

您可以使用Regex模式来确保目录名称可安全比较。

val dirPattern = raw"\d+.(\d+)-(\d+)".r

listOfDirNames.maxBy{
  dirPattern.unapplySeq(_)
            .collect{case List(a,b) => (a.toInt,b.toInt)}
            .getOrElse((0,0))
}

答案 1 :(得分:1)

您可以定义一个将文件名解析为3个数字的元组的方法:

import scala.util.Try

def parse(s: String) = s.split("[.-]") match { //simple one case thanks to jwvh ;)
   case Array(_, a, b) => Try(a.toInt, b.toInt).toOption //in case there's folder like 34.xxx-0
   case _ => None
}

然后使用它来查找最后一个文件:

 val lastFile = new File("/test")
    .listFiles(_.isDirectory)
    .maxBy(f => parse(f.getName))

Scala 2.13 中,您还可以这样做:

def parse(s: String) = s match {
   case s"${_}.$a-$b" => Try(a.toInt, b.toInt).toOption
   case _ => None
}

可以说更具可读性。