@@ -7,8 +7,12 @@ package dotty.tools.io
7
7
8
8
import scala .language .implicitConversions
9
9
import java .io .RandomAccessFile
10
- import java .nio .file .{ DirectoryNotEmptyException , FileAlreadyExistsException , Files , NoSuchFileException , Paths }
10
+ import java .nio .file ._
11
11
import java .net .{URI , URL }
12
+ import java .nio .file .attribute .BasicFileAttributes
13
+ import java .io .IOException
14
+
15
+ import scala .collection .JavaConverters ._
12
16
13
17
import scala .util .Random .alphanumeric
14
18
@@ -51,7 +55,7 @@ object Path {
51
55
def onlyDirs (xs : List [Path ]): List [Directory ] = xs filter (_.isDirectory) map (_.toDirectory)
52
56
def onlyFiles (xs : Iterator [Path ]): Iterator [File ] = xs filter (_.isFile) map (_.toFile)
53
57
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
55
59
56
60
def apply (path : String ): Path = apply(Paths .get(path))
57
61
def apply (jpath : JPath ): Path = try {
@@ -221,22 +225,30 @@ class Path private[io] (val jpath: JPath) {
221
225
try { create; true } catch { case _ : FileAlreadyExistsException => false }
222
226
223
227
// deletions
224
- def delete (): Unit = delete(jpath)
228
+ def delete (): Unit =
229
+ try { Files .deleteIfExists(jpath) } catch { case _ : DirectoryNotEmptyException => }
225
230
226
231
/** Deletes the path recursively. Returns false on failure.
227
232
* Use with caution!
228
233
*/
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
+ }
235
250
}
236
251
237
- private def delete (path : JPath ): Boolean =
238
- try { Files .deleteIfExists(path); true } catch { case _ : DirectoryNotEmptyException => false }
239
-
240
252
def truncate () =
241
253
isFile && {
242
254
val raf = new RandomAccessFile (jpath.toFile, " rw" )
0 commit comments