Scala: для цикла: итерация по потоку каталогов

1

Обновление: я написал следующий обновленный код после ввода от экспертов Scala. Ниже приведен обновленный код. Код компилируется, но при "запуске" выбрасывается исключение IllegalStateException: я опубликовал ошибку stacktrace после перечисления кода:

import java.io.IOException
import java.nio.file.FileSystems
import java.nio.file.FileVisitOption
import java.nio.file.FileVisitResult
import java.nio.file.FileVisitor
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import java.nio.file.attribute.BasicFileAttributes
import java.util.EnumSet
import java.nio.file.{DirectoryStream,DirectoryIteratorException}
 import scala.collection.JavaConversions._

class TestFVis(val searchPath: Path) extends FileVisitor[Path] {

    //Here I provide implementations for postVisitDirectory,  
    //preVisitDirectory, visitFile, and visitFileFailed

}



object Main {

  def main(args: Array[String]) {
    val searchFileOrFolder: Path = Paths.get("C://my_dir")
    println("The Path object is: " + searchFileOrFolder)
    var testFileVisitorTop = new TestFVis(searchFileOrFolder)
    println("Our top level FileVisitor is: " + testFileVisitorTop)

     val opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS)
    val rootDirsIterable: Iterable[Path] = FileSystems.getDefault.getRootDirectories //returns the default filesystem
    // and then returns an Iterable[Path]  to iterate over the paths of the root directories

      var dirStream:Option[DirectoryStream[Path]] = None

      for(rootDir <- rootDirsIterable) {
        println("in the Outer For")
        dirStream= Some(Files.newDirectoryStream(searchFileOrFolder))
        def dstream = dirStream.get
        val streamIter = dstream.iterator().filter((path) => {
                     Files.isRegularFile(path)
                   })

        for( dirStreamUnwrapped <- dirStream;(filePath:Path) <- dirStreamUnwrapped) {
        //for( (filePath: DirectoryStream[Path]) <- dirStream) {
            val tempPath = Files.walkFileTree(filePath, testFileVisitorTop) 
            //val tempPath = Files.walkFileTree(fileOrDir,opts,Integer.MAX_VALUE,testFileVisitorTop)
            println("current path is: " + tempPath)
            if (!testFileVisitorTop.found) {
              println("The file or folder " + searchFileOrFolder+ " was not found!")
            }
        }


      }

  }
}

Однако для исторического контекста здесь возникает ошибка компиляции, которую я получил поначалу:

[error]  found   : java.nio.file.Path => Unit
[error]  required: java.nio.file.DirectoryStream[java.nio.file.Path] => ?
[error]                 for((filePath:Path) <- dirStream) {

- После изменения кода: код компилируется без ошибок, но я получаю исключение IllegalStateException в sbt 'run'\

> run
ur top level FileVisitor is C:\my_dir
Our top level FileVisitor is: com.me.ds.TestFileVisitor
@5564baf6
in the Outer For
[error] (run-main-0) java.lang.IllegalStateException: Iterator already obtained
java.lang.IllegalStateException: Iterator already obtained
        at sun.nio.fs.WindowsDirectoryStream.iterator(WindowsDirectoryStream.jav
a:117)
        at scala.collection.convert.Wrappers$JIterableWrapper.iterator(Wrappers.
scala:54)
        at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
        at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
        at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.s
cala:777)
        at com.me.ds.Main$$anonfun$main$1$$anonfun$appl
y$1.apply(SampleFileVis.scala:76)
        at com.me.ds.Main$$anonfun$main$1$$anonfun$appl
y$1.apply(AFileVisitor.scala:76)
        at scala.Option.foreach(Option.scala:256)
        at **com.me.ds.Main$$anonfun$main$1.apply(SampleFileVisitor.scala:76)**
        at com.me.ds.Main$$anonfun$main$1.apply(AFileVi
sitor.scala:68)
        at scala.collection.Iterator$class.foreach(Iterator.scala:743)
        at scala.collection.AbstractIterator.foreach(Iterator.scala:1195)
        at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
        at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
        at com.me.ds.Main$.main(SampleFileVis.scala:68)
        at com.me.ds.Main.main(SampleFileVis.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
[trace] Stack trace suppressed: run last compile:run for the full output.
java.lang.RuntimeException: Nonzero exit code: 1
        at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) Nonzero exit code: 1
[error] Total time: 0 s, completed Mar 24, 2015 7:32:38 AM
>

= ------------- Я тоже выхожу и сам расследую эту ошибку. Если кто-то может указать мне в правильном направлении, что бы сделать мой код компилируемым и запущенным, я бы выполнил свою цель здесь.

благодаря

Теги:
nio

2 ответа

1
  1. object должен быть строчным.

  2. dirStream должно предшествовать val.

  3. у вас слишком много } в конце.

  4. у вас есть new TestFileVisitor но вы имели в виду new TestFVis.

  5. dirStream имеет тип: Some[DirectoryStream[Path]], что означает, что вам нужно (filePath: DirectoryStream[Path]) <- dirStream

  • 0
    Вы правы насчет ошибок в коде. Спасибо за указание на это
  • 0
    Я включил ваши исправления, а также изменил код, но он все еще не работает. Я выложу новый код.
1

Все, что вы делаете с первым, это разворачивание Option, которую нельзя передать в Path. Вам просто нужно взять ваш развернутый объект и использовать его в следующей части:

for(dirStreamUnwrapped <- dirStream;
    (filePath:Path) <- dirStreamUnwrapped) {
  val tempPath = Files.walkFileTree(filePath, testFVis) 
}
  • 0
    Возможно, вы имели в виду: for (dirStreamUnwrapped <- dirStream; (filePath: Path) <- dirStreamUnwrapped)) {val tempPath = Files.walkFileTree (filePath, testFVis)}
  • 0
    @ user3825558 Если я что-то упустил, разве это не то же самое?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню