Java文件“Top”Parent

时间:2013-04-11 14:07:09

标签: java file scala

我有一个java.io.File,例如

/foo/bar/baz

我想获得文件的“顶级”父级,在本例中为

/foo/

显然,这是特定于Linux的 - 我并不担心跨平台兼容的解决方案,但如果它更优雅的话!

我在Scala中设法提出的最好成绩如下:

def topParent( file : File ) : File =
{
    var temp = file
    while ( temp.getParent != "/" ) temp = temp.getParentFile
    temp
}

具有以下行为:

scala> topParent( new java.io.File( "/foo/bar/baz" ) )
res14: java.io.File = /foo

但似乎有点不雅观。有没有人有更好的解决方案?

2 个答案:

答案 0 :(得分:0)

有一个递归解决方案在函数样式中使用尾递归执行相同的操作,正如bmorris591在注释中指出的那样:

@tailrec def topParent(file: File): File = 
    if(file.getParent == "/") file else topParent(file.getParentFile)

答案 1 :(得分:0)

您可能希望使用getCanonicalFile来确保其格式正确。

我不确定你认为更优雅;无论如何,你必须一路走回去。您也可以执行类似

的操作
def topParent(file: File): Option[File] = {
  Iterator.iterate(file.getCanonicalFile)(_.getParentFile).
    takeWhile(_ != null).
    toList.
    reverse.
    drop(1).
    headOption
}

至少避免让父母两次。