gpt4 book ai didi

file - 如何从 Fortran 代码中了解文件是否被任何程序打开 (Windows 7)

转载 作者:行者123 更新时间:2023-12-03 02:27:27 25 4
gpt4 key购买 nike

我有一个 Fortran 代码,它通过在文本文件的最底部添加一些新的实时测量值来实时更新文本文件的内容。该文本文件由流体动力学代码(连续实时运行)和另一个由 matlab 代码构建的可执行文件(执行绘图)使用(只读)。我想在 Fortran 代码中添加一行:仅当文本文件未被任何其他程序打开时才更新该文件。我尝试使用查询:

do
INQUIRE(FILE = filename,OPENED = ISopen)
if (.not.ISopen) then
ADD NEW MEASUREMENTS HERE
exit
endif
endif
enddo

在运行这个 Fortran 程序之前,我用文本板打开了该文件。然而,变量 ISopen 为 false。所以我想 INQUIRE 可能只适用于测试文件是否在 fortran 程序本身中打开。事实上,如果我在上面的代码片段的开头添加:

OPEN (33,FILE = filename)

那么 ISopen 为真。然后,我从 Fortran 代码创建了一个可执行文件,其中仅包含:

OPEN (33,FILE = filename)
pause
CLOSE(33)

我运行它并让它处于暂停状态。然后我运行上面发布的第一个代码,ISopen 仍然是错误的。知道如何测试 Fortran 中的任何其他程序是否打开文件吗?我的操作系统是windows 7。谢谢

最佳答案

最后我是这样解决的。我找不到一种方法来知道文件是否已打开,即使有一种方法,在我检查文件是否打开然后修改它之间仍然可能发生其他程序打开它的情况。因此,我只是创建要修改的文件的临时副本,修改此临时副本,然后通过覆盖原始文件将文件移回原处。仅当文件未锁定(即没有其他程序打开该文件来读取数据)时才执行后一个操作,因此我一直尝试复制它,直到成功为止。我在很多情况下进行了测试并且它有效。代码是:

   USE IFPORT
IMPLICIT NONE
character*256 :: DOScall
logical :: keepTRYING
integer :: resul

DOScall = 'copy D:\myfile.txt D:\myfile_TMP.txt' !create temporary copy
resul = SYSTEM(DOScall)
open(15,file ='D:\myfile_TMP.txt',form = 'formatted')
!.... perform here some writing operations on myfile_TMP........
close(15)
do
resul = SYSTEM('move D:\myfile_TMP.txt D:\myfile.txt')
if (resul==0) then
exit
else
pause(10)
endif
enddo

请注意,对于在文件中执行读取操作的多个程序和一个在文件中执行写入操作的程序来说,这完全可以正常工作(就像在我的情况下,我有 2 个程序读取而只有一个程序写入)。如果多个程序写入同一个文件,我想必须使用其他一些并行技术。

关于file - 如何从 Fortran 代码中了解文件是否被任何程序打开 (Windows 7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34729259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com