0

我有一个 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

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

4

2 回答 2

0

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

@tailrec def topParent(file: File): File = 
    if(file.getParent == "/") file else topParent(file.getParentFile)
于 2013-04-11T14:58:49.080 回答
0

您可能想使用getCanonicalFile它来确保它的格式正确。

我不确定您认为哪种更优雅;无论如何,您都必须一路走回来。你也可以做类似的事情

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

这至少避免了两次获得父母。

于 2013-04-11T14:59:01.237 回答