Scala - 根据文件后缀名从文件夹中删除文件

4

我希望找到一种优雅的方式来删除文件夹中所有扩展名为 .jpg 的文件。

我有以下代码来统计文件夹中总共有多少个 jpg 文件:

Option(new File(path).list).map(_.filter(_.endsWith(".jpg")).size).getOrElse(0)

提前感谢,非常感谢任何帮助 :)


什么问题?哪里出了问题? - kiritsuku
这并不是说它无法工作,上面的代码计算文件夹中所有jpg文件的总数,我要找的是一种删除它发现的文件的方法,以便删除该文件夹中的所有jpg文件。谢谢。 - jahilldev
os-lib 是使用 Scala 执行文件系统操作的最优雅方式。请查看我的答案,了解删除扩展名为 .jpg 的文件的简洁代码。 - Powers
3个回答

12
for {
  files <- Option(new File(path).listFiles)
  file <- files if file.getName.endsWith(".jpg")
} file.delete()

谢谢,好像在编译时出现了错误:value endsWith不是java.io.File的成员。 - jahilldev
是的,抱歉,我错过了那个。 - Debilski
可能你可以尝试使用类似于 new File(path).listFiles.filter(_.getName.endsWith(".jpg")).foreach(_.delete) 的方式来代替显式的 for 循环。 - aishwarya
我们为什么要在这里使用' Option '? - Luigi Plinge
2
Option作为空值检查,当list和listFiles返回null时需要它。 - jahilldev

0

os-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", "")

0

一些额外的评论, 为了扩展@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.. 

在我看来,这样做更安全,并且充分发挥了Scala的效应功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接