在Scala中递归删除目录

Mic*_*ael 23 java scala file

我正在编写以下内容(使用Scala 2.10和Java 6):

import java.io._

def delete(file: File) {
  if (file.isDirectory) 
    Option(file.listFiles).map(_.toList).getOrElse(Nil).foreach(delete(_))
  file.delete
}
Run Code Online (Sandbox Code Playgroud)

你会如何改进它?代码似乎工作但它忽略了返回值java.io.File.delete.可以用它scala.io代替java.io吗?

Gar*_*all 25

尝试此代码,如果失败则抛出异常:

def deleteRecursively(file: File): Unit = {
  if (file.isDirectory) {
    file.listFiles.foreach(deleteRecursively)
  }
  if (file.exists && !file.delete) {
    throw new Exception(s"Unable to delete ${file.getAbsolutePath}")
  }
}
Run Code Online (Sandbox Code Playgroud)

如果要为所有删除返回值,也可以折叠或映射删除.


Suk*_*aar 20

用纯scala + java方式

import scala.reflect.io.Directory

val directory = new Directory(new File("/sampleDirectory"))
directory.deleteRecursively()
Run Code Online (Sandbox Code Playgroud)

deleteRecursively()失败时返回false

  • 与此处发布的其他解决方案相比,这是简单干净的。 (2认同)

Gab*_*lla 19

使用scala IO

import scalax.file.Path

val path = Path.fromString("/tmp/testfile")    
try {
  path.deleteRecursively(continueOnFailure = false) 
} catch {
  case e: IOException => // some file could not be deleted
}
Run Code Online (Sandbox Code Playgroud)

或者更好,你可以使用 Try

val path: Path = Path ("/tmp/file")
Try(path.deleteRecursively(continueOnFailure = false))
Run Code Online (Sandbox Code Playgroud)

这将导致Success[Int]包含已删除文件的数量,或者a Failure[IOException].

  • 谢谢.我不想使用任何外部依赖项. (4认同)

Dan*_*SFT 12

来自 http://alvinalexander.com/blog/post/java/java-io-faq-how-delete-directory-tree

使用Apache Common IO

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.WildcardFileFilter;
public void deleteDirectory(String directoryName)
throws IOException
{
  try
  {
    FileUtils.deleteDirectory(new File(directoryName));
  }
  catch (IOException ioe)
  {
    // log the exception here
    ioe.printStackTrace();
    throw ioe;
  }
}
Run Code Online (Sandbox Code Playgroud)

Scala可以做到这一点......

import org.apache.commons.io.FileUtils
import org.apache.commons.io.filefilter.WildcardFileFilter
FileUtils.deleteDirectory(new File(outputFile))
Run Code Online (Sandbox Code Playgroud)

Maven Repo Imports


Vla*_*eev 5

使用Java NIO.2 API:

import java.nio.file.{Files, Paths, Path, SimpleFileVisitor, FileVisitResult}
import java.nio.file.attribute.BasicFileAttributes

def remove(root: Path): Unit = {
  Files.walkFileTree(root, new SimpleFileVisitor[Path] {
    override def visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult = {
      Files.delete(file)
      FileVisitResult.CONTINUE
    }
    override def postVisitDirectory(dir: Path, exc: IOException): FileVisitResult = {
      Files.delete(dir)
      FileVisitResult.CONTINUE
    }
  })
}

remove(Paths.get("/tmp/testdir"))
Run Code Online (Sandbox Code Playgroud)

真的,很遗憾NIO.2 API与我们一起使用了这么多年,尽管实际上它比旧的FileAPI 优越,但很少有人在使用它。