我希望找到一种优雅的方式来删除文件夹中所有扩展名为 .jpg 的文件。
我有以下代码来统计文件夹中总共有多少个 jpg 文件:
Option(new File(path).list).map(_.filter(_.endsWith(".jpg")).size).getOrElse(0)
提前感谢,非常感谢任何帮助 :)
我希望找到一种优雅的方式来删除文件夹中所有扩展名为 .jpg 的文件。
我有以下代码来统计文件夹中总共有多少个 jpg 文件:
Option(new File(path).list).map(_.filter(_.endsWith(".jpg")).size).getOrElse(0)
提前感谢,非常感谢任何帮助 :)
for {
files <- Option(new File(path).listFiles)
file <- files if file.getName.endsWith(".jpg")
} file.delete()
new File(path).listFiles.filter(_.getName.endsWith(".jpg")).foreach(_.delete)
的方式来代替显式的 for 循环。 - aishwaryaos-lib让你可以用一行代码删除所有特定扩展名的文件:
os.list(os.pwd/"pics").filter(_.ext == "jpg").map(os.remove)
如此处所述,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", "")
一些额外的评论,
为了扩展@Debilski的答案:
显然触摸文件会导致副作用
。为了使这个功能具有效果
,请执行以下操作:
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..