打开已知名称部分的文件

时间:2015-11-10 15:01:18

标签: fortran fortran90

我必须

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

问题是,我只知道文件名的一部分,因为最后一部分是一个数字,每次执行程序时都会改变,我不知道生成数字的系统(外部库)

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

1 个答案:

答案 0 :(得分:1)

不幸的是,您需要先知道文件名才能打开它。 Fortran在这方面缺少的一件事是能够检查文件系统。您的选择归结为

  • EXECUTE_COMMAND_LINESYSTEM来调用外部程序,或
  • 使用iso_c_binding功能调用C标准库函数。

我觉得第二个选项有点麻烦,因为你需要做的调用涉及很多typdef类型,结构和C指针。如果您还不熟悉Fortran / C互操作,那肯定是可行的,但不会是最直接的。

如果您可以编写shell命令来查找文件名,那么调用execute_command_linesystem会更“容易”,那么您已经有了解决方案。

作为一个例子,我有一个库,用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只返回一个文件名。如果它有多个匹配项,您需要优化搜索或在Fortran中处理该情况,以便从临时文件中的文件名中获取正确的文件。