我正在寻找一种优雅的方法来删除扩展名为.jpg
的文件夹中的所有文件我有以下内容来计算文件夹中的总jpg文件:
Option(new File(path).list).map(_.filter(_.endsWith(".jpg")).size).getOrElse(0)
在此先感谢,任何帮助非常感谢:)
答案 0 :(得分:11)
for {
files <- Option(new File(path).listFiles)
file <- files if file.getName.endsWith(".jpg")
} file.delete()
答案 1 :(得分:0)
一些额外的评论,
扩展@Debilski的答案:
触摸文件显然会导致side effects
。要使其在功能上effectfull
,请执行以下操作:
def deleteFilesBySuffix[G[_]: Sync](suffix: String)(dirName: String): G[Unit] =
Sync[G].suspend(Sync[G].fromTry(Try(for {
files <- Option(new File(dirName).listFiles)
file <- files if file.getName.endsWith(suffix)
} file.delete())))
然后, 您必须以可能会延迟 像这样的方法的执行:
import cats.IO
import cats.syntax.foldable._
val r = deleteFilesBySuffix[IO]("jpg")("/tmp")
//Still nothing happened
//Another example with multiple dirs:
val dirNames = List("/tmp", "/tmp/myDir")
val res = dirNames.traverse_(deleteFilesBySuffix[IO]("jpg"))
//Actually run it..
r.unsafeRunSunc()
//Now files are deleted..
我认为这更安全,并使用Scala
的{{1}}力量
答案 2 :(得分:0)
os-lib使您可以使用一个衬里删除具有特定扩展名的所有文件:
os.list(os.pwd/"pics").filter(_.ext == "jpg").map(os.remove)
如here所述,os-lib是使用Scala执行文件系统操作的最简单方法。它使您可以编写美观,简洁的Scala代码,而不必处理基础Java库的丑陋情况。
如果您想在计算机上进行测试,请使用以下设置代码:
os.makeDir(os.pwd/"pics")
os.write(os.pwd/"pics"/"family.jpg", "")
os.write(os.pwd/"pics"/"cousins.txt", "")
os.write(os.pwd/"pics"/"gf.jpg", "")
os.write(os.pwd/"pics"/"friend.gif", "")