我正在编写以下内容(使用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
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].
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)
使用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 优越,但很少有人在使用它。
| 归档时间: |
|
| 查看次数: |
22827 次 |
| 最近记录: |