閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

Scalaでls(ディレクトリ内のファイルを取得する)

Javaを知らないのでもっと良い方法があるのかもしれませんが、File.listFilesメソッドで指定ディレクトリの中にあるファイル、ディレクトリの一覧が取得できるそうです。指定ディレクトリの中身を漁るだけなら一行で書けました。

import java.io._
def ls1(dir: String) = {
  new File(dir).listFiles.foreach(println)
}

ディレクトリ以下も見ていくなら:

def ls2(dir: String) : Unit = {
  new File(dir).listFiles.map {
	case f if f.isDirectory => ls2(f.getPath)
	case x => x
  } foreach {
	case f: File => println(f.getPath)
	case _ =>
  }
}

としましたが、foreachの中がキモい事に。Scalaでls - みずぴー日記を見るとflatMapが使えるようなので、真似して

def ls3(dir: String)  {
  def ls(dir: String) : Seq[File] = {
	new File(dir).listFiles.flatMap {
	  case f if f.isDirectory => ls(f.getPath)
	  case x => List(x)
	}
  }
  ls(dir).foreach(println)
}

という感じに。ディレクトリ名がprintされませんがまぁ気にしない。

def ls4(dir: String) : Unit = {
  def ls(dir: String) : Seq[File] = {
	new File(dir).listFiles.flatMap {
	  case f if f.isDirectory => ls(f.getPath)
	  case x => List(x)
	}
  }
  ls(dir).filter(_.getPath.endsWith(".cpp")).foreach(println)
}

filterかませば任意の条件を満たすファイルだけを取れる、と。