打开部分名称已知的文件

Open file with part of name known

我必须

open(unit,file='x',status='old',action='read',iostat=io_error)

问题是,我只知道文件名的一部分,因为最后一部分是每次执行程序时都会更改的数字,而且我不知道生成该数字的系统(外部图书馆)。

有没有办法打开只知道部分文件名的文件?

很遗憾,您需要知道文件名才能打开它。 Fortran 在这方面缺乏的一件事是检查文件系统的能力。您的选择归结为

  • EXECUTE_COMMAND_LINESYSTEM调用外部程序,或
  • 使用iso_c_binding特性调用C标准库函数。

我发现第二个选项有点麻烦,因为您需要进行的调用涉及大量 typdef 类型、结构和 C 指针。这当然是可行的,但如果您还不熟悉 Fortran/C 互操作,它就不是最直接的。

调用 execute_command_linesystem 是 'easier',因为如果您可以编写 shell 命令来查找您的文件名,那么您已经有了解决方案。

例如,我有一个库可以读取 N 个文件的 HDF5 数据,其中 N 基于模型时间步并且可能是不规则的。与其让用户承担枚举文件的负担,不如让我处于与您相似的位置。我解决你的问题的方法是这样的:

character(len=*), parameter :: temporary_file = '/tmp/something_unique'
character(len=*) :: filename_fragment, filename
integer :: u

call execute_command_line('find . -name '//trim(filename_fragment)// &
                          "* -printf '%f\n' > "//trim(temporary_file)
open(newunit=u, file=temporary_file, action="read")
read(u, '(A)') filename
close(u)

如果 filename_fragment 是您知道的名称的一部分,这只不过是调用 find 并重定向了输出。例如。如果 filename_fragment 是 "datasetABC_" 这将 运行

find . -name 'datasetABC_*' -printf '%f\n' > /tmp/something_unique

文件 /tmp/something_unique 每行将包含一个与您的搜索匹配的文件名。您可能需要将参数调整为 find 以适用于您的特定情况,但这为您提供了如何进行的总体思路。完成此工作后,您只需打开 /tmp/something_unique 并从文件中读取完整的文件名,现在您就知道了打开文件的全名。

* 注意:上述解决方案假定您的 find 将 return 只有一个文件名。如果它有多个匹配项,您将需要优化搜索或在 Fortran 中处理这种情况,以便从临时文件中的文件名中获取正确的文件。