在 Rascal 中跨 Windows 和基于 Unix 的操作系统统一文件方案/路径

问题描述 投票:0回答:1

Rascal MPL 中跨 Windows 和基于 Unix 的文件系统处理目录的最佳方法是什么,以便 Rascal 项目的用户可以在这些操作系统中正确读取和生成文件?

rascal
1个回答
0
投票

视情况而定。

  • 如果您只需要确保代码在 Windows 和 Unix 上都能运行,那么最好不要自己输入根路径。因此,请使用
    home:///
    tmp:///
    project://<name>
    ,或使用
    IO::findResources
    • 有了这些根路径,请使用
      +
      到达子级:
      path + "myFile.rsc"
      将负责正确的转义、编码并添加路径分隔符
      /
    • 您可以使用
      myPath.ls
      获取文件夹中的条目列表。此外,在
      util::FileSystem
      中,还有更多可在任何位置进行的操作,以获取文件系统的概述。
    • IO模块中的所有API都是独立于OS的,
      remove
      lastModidied
      等等
  • 如果您要将分析结果从一台计算机迁移到另一台计算机,则 URI 可能会有所不同。例如,您在分析结果或中间
    |file:///C:Program%20Files/|
    模型中将
    M3
    作为文字。在这种情况下,所有下游分析都将正常工作,但跳转到代码将无法正常工作(因为 Mac 上的代码没有该文件夹)。
    • 您可以返回到原始分析机器,并尝试使用上述建议,这样机器相关的文件 URI 就会消失。不幸的是,对于像
      clair
      这样的一些库来说,这不起作用。他们总是产生
      file:///
      URI。
    • 您可以编写信息转换,用新信息替换模型中的原始位置。函数
      IO::relativize
      在这里是基本的。如果合适的话,它将通过删除给定的前缀来为您提供后缀唯一的路径名。所以
      relativize(|file:///C:Program%20Files|, |file:///C:Program%20Files/Hello.txt|)
      产生
      relative:///Hello.txt
      。然后你可以将相对路径添加到新路径中:
      newPath + relative.path
      。这种转换在模型大小上是线性的,可能需要几秒钟!通常,您会
      visit { case loc l => ...}
      在几行代码中编写必要的所有位置。
  • 如果您想将文件从一个操作系统写入另一个操作系统,那么您可以简单地构建位置,将数据发送到另一侧,然后在那里执行生成器。因此,在我的 Mac 上,我会创建位置:
    |file:///C:Program%20Files/Hello.txt|
    ,将其发送到 Windows 计算机,当
    writeFile
    使用时,它会产生所需的效果。

简而言之:

  • Rascal URI(位置)值只是值。在将它们赋予 IO 函数之前,它们没有任何特殊意义。它们充当身份,可以通过网络传送或在驱动器上通信,不会出现任何问题。
  • 模块 IO 功能是通用的,它们以相同的方式在所有操作系统上工作。
  • 执行 IO 函数的操作系统上必须存在路径和 URI 方案,否则,您只会得到 IO 异常。
© www.soinside.com 2019 - 2024. All rights reserved.