Scala 从Heroku上Play framework中的目录读取文件

Scala 从Heroku上Play framework中的目录读取文件,scala,heroku,playframework-2.0,Scala,Heroku,Playframework 2.0,我有一个具有深层结构的目录(很多子目录和文件),我从我的play应用程序中读取。在我的电脑上,我使用- val directory = Play.getFile("directory") for(file <- directory.listFiles) { val lines = Source.fromFile(file).getLines() } val directory=Play.getFile(“目录”) for(filePlay.getFile(relativePath)检

我有一个具有深层结构的目录(很多子目录和文件),我从我的play应用程序中读取。在我的电脑上,我使用-

val directory = Play.getFile("directory")
for(file <- directory.listFiles) {
  val lines = Source.fromFile(file).getLines()
}
val directory=Play.getFile(“目录”)
for(filePlay.getFile(relativePath)检索相对于当前应用的根路径的文件。当前应用的根路径在您的PC和Heroku上可能不同

还有一件事:您关于目录对象未生成的声明是不正确的。
listFiles
操作正在您的案例中抛出NPE

尝试此操作可从目录中获取文件列表:

 val listOfFilesInDirectory: List[java.io.File] = Option(getClass.getResource("/directory")).map(_.toURI).map(new java.io.File(_)).map(_.listFiles).flatten.toList

您可以将文件放在
conf
文件夹下,以便这些文件不公开。然后使用:

Play.resource("conf/directory"): Option[URL]

正如所建议的,为了使
Play.getFile(“location\u from\u project\u root”)
(或任何其他类似文件)在生产环境中工作,您必须明确要求Play将放置文件的目录添加到dist

例:

如果要访问文件
Project\u Root/resources/mtFile.json
,可以使用
Play.getFile(“/resources/mtFile.json”)
方法

但为了使其在任何生产环境中都能工作,您必须将
/resources
文件夹添加到dist。否则该文件将不存在。为此,您必须将这些行添加到
build.sbt
文件中

import com.typesafe.sbt.packager.MappingsHelper._
mappings in Universal ++= directory(baseDirectory.value / "resources")

现在,如果您使用
activator dist
命令获取一个dist,您可以看到名为
/resources
的目录已添加到dist的根目录中。现在
Play.getFile(“/resources/mtFile.json”)
应该在生产环境中工作。

只有当目录处于public下并且我将URL指定为“公共/目录"。我不想将我的目录公开。如果您将此目录名指定为环境变量,以便在Heroku和您的PC上进行不同的设置,会发生什么情况?我认为这是因为您无法将目录作为资源打开,因为该目录位于您的类路径中。您是否有任何可以包含此列表的索引文件要打开的文件数量?这就是我最后要做的-保留一个具有目录/文件结构的索引文件。但这不是一个好的解决方案:(你找到解决方案了吗?我认为问题在于这些资源目录尚未添加到发行版中。为此,你必须明确提到要在Play framework中添加的目录。可能是@supunvyjerathne的副本,该副本仅适用于public。我的问题是专门针对非public的。那么你是否获得了“文件”调用Play.getFile()时出现“找不到”错误,对吗?
import com.typesafe.sbt.packager.MappingsHelper._
mappings in Universal ++= directory(baseDirectory.value / "resources")