@@ -7,8 +7,12 @@ package dotty.tools.io
77
88import scala .language .implicitConversions
99import java .io .RandomAccessFile
10- import java .nio .file .{ DirectoryNotEmptyException , FileAlreadyExistsException , Files , NoSuchFileException , Paths }
10+ import java .nio .file ._
1111import java .net .{URI , URL }
12+ import java .nio .file .attribute .BasicFileAttributes
13+ import java .io .IOException
14+
15+ import scala .collection .JavaConverters ._
1216
1317import scala .util .Random .alphanumeric
1418
@@ -51,7 +55,7 @@ object Path {
5155 def onlyDirs (xs : List [Path ]): List [Directory ] = xs filter (_.isDirectory) map (_.toDirectory)
5256 def onlyFiles (xs : Iterator [Path ]): Iterator [File ] = xs filter (_.isFile) map (_.toFile)
5357
54- def roots : List [Path ] = java.io. File .listRoots ().toList .map(r => Path .apply(r.toPath))
58+ def roots : List [Path ] = FileSystems .getDefault.getRootDirectories.iterator ().asScala .map(Path .apply).toList
5559
5660 def apply (path : String ): Path = apply(Paths .get(path))
5761 def apply (jpath : JPath ): Path = try {
@@ -221,22 +225,30 @@ class Path private[io] (val jpath: JPath) {
221225 try { create; true } catch { case _ : FileAlreadyExistsException => false }
222226
223227 // deletions
224- def delete (): Unit = delete(jpath)
228+ def delete (): Unit =
229+ try { Files .deleteIfExists(jpath) } catch { case _ : DirectoryNotEmptyException => }
225230
226231 /** Deletes the path recursively. Returns false on failure.
227232 * Use with caution!
228233 */
229- def deleteRecursively (): Boolean = deleteRecursively(jpath)
230- private def deleteRecursively (p : JPath ): Boolean = {
231- import scala .collection .JavaConverters ._
232- if (Files .isDirectory(p))
233- Files .list(p).iterator().asScala.foreach(deleteRecursively)
234- delete(p)
234+ def deleteRecursively (): Boolean = {
235+ if (! exists) false
236+ else {
237+ Files .walkFileTree(jpath, new SimpleFileVisitor [JPath ]() {
238+ override def visitFile (file : JPath , attrs : BasicFileAttributes ) = {
239+ Files .delete(file)
240+ FileVisitResult .CONTINUE
241+ }
242+
243+ override def postVisitDirectory (dir : JPath , exc : IOException ) = {
244+ Files .delete(dir)
245+ FileVisitResult .CONTINUE
246+ }
247+ })
248+ true
249+ }
235250 }
236251
237- private def delete (path : JPath ): Boolean =
238- try { Files .deleteIfExists(path); true } catch { case _ : DirectoryNotEmptyException => false }
239-
240252 def truncate () =
241253 isFile && {
242254 val raf = new RandomAccessFile (jpath.toFile, " rw" )
0 commit comments