Fortran Coder

标题: Fortran复制文件 [打印本页]

作者: 1035326373    时间: 2015-7-24 21:41
标题: Fortran复制文件
用Fortran处理数据时,需要将当前目录下子目录的文件复制到当前另外子目录下,需要复制的文件的目录从文本文件中读取(只给出子目录名及需要复制文件的名称\a\b.txt)。用Fortran怎么实现?最好用类似systemqq的命令。

作者: 楚香饭    时间: 2015-7-25 10:54
本帖最后由 楚香饭 于 2015-7-25 10:57 编辑

比如说
把 a 文件夹下 b.txt 复制到 c 文件夹下 d.txt

那么有几种方法:

第一.使用扩展语法,调用系统命令:
这种方法缺点是依赖具体编译器,需要你了解系统命令;优点是简单。
在windows上,是 copy
call systemqq("copy a\b.txt c\d.txt")
有的是可能是 call system("copy a\b.txt c\d.txt")
有的情况下,可能还需要 use IFPort 之类的语句。
在linux 上,是 cp
call system("cp ./a/b.txt ./c/d.txt")

这种方法可能会输出一些你不希望看到的信息,例如,复制成功,或复制失败。
此时,你可以用重定向。例如
windows 上
call systemqq("copy a\b.txt c\d.txt 1>NUL 2>NUL")
linux 上
call system("cp ./a/b.txt ./c/d.txt 1>/dev/null 2>&1")
这样就可以隐藏提示信息了。

第二.使用标准语法,调用系统命令:
这种方法的优点是通用性好,是语法标准。
call EXECUTE_COMMAND_LINE("copy a\b.txt c\d.txt")
同第一种方法,windows 和 linux命令行写法不同,也有提示信息的问题。

第三. 在windows上使用API函数
这种方法的优点是没有错误信息显示,缺点是只在windows上使用。
[Fortran] 纯文本查看 复制代码
use Kernel32
integer :: i
i = CopyFile("a\\b.txt"c , "c\\d.txt"c , 1 ) !此处的1表示不覆盖,0表示覆盖


第四. 打开源文件,把读到的数据全部相同的写入新文件
这种方法优点是支持所有的编译器,所有的操作系统,效率也还可以,而且大文件可以改一下产生进度提示。棒棒哒!
给你一个我以前写好的代码。你可以直接调用。
[Fortran] 纯文本查看 复制代码
Program www_fcode_cn
  Implicit None
  Logical :: b , fcCopyFile
  b = fcCopyFile( "a\b.bin" , "c\d.txt" , .true. )
  write(*,*) b
End Program www_fcode_cn

Logical Function fcCopyFile( cSource , cDest , Overwrite )
  Implicit None
  Character(Len=*) , Intent(IN) :: cSource , cDest
  Logical , Intent(IN) :: Overwrite
  Integer , parameter :: nSizePerTime = 20*1024 !// 每次20KB
  Character(Len=nSizePerTime ) :: cBuffer
  integer :: iuSrc , iuDst , nSize , ierr , i , j
  logical :: b
  fcCopyFile = .false.
  If ( .NOT.Overwrite ) then !// 如果不覆盖
    Inquire( File = cDest , Exist = b )
    if ( b ) return !// 且目标文件存在,则直接返回
  End If  
  Inquire( File = cSource , Size = nSize ) !// 查询源文件大小  
  Open( NewUnit = iuSrc , File=cSource , access="Stream",form="unformatted" , iostat = ierr )
  if ( ierr /= 0 ) return !// 打开失败,返回
  Open( NewUnit = iuDst , File=cDest   , access="Stream",form="unformatted" , iostat = ierr )
  if ( ierr /= 0 ) return !// 打开失败,返回
  j = mod( nSize , nSizePerTime ) !// 求余数
  if ( j > 0 ) then
    read ( iuSrc ) cBuffer(1:j)
    write( iuDst ) cBuffer(1:j)
  end if
  Do i = j+1 , nSize , nSizePerTime
    read ( iuSrc ) cBuffer
    write( iuDst ) cBuffer
  End Do  
  Close( iuSrc )
  Close( iuDst )
  fcCopyFile = .true.
End Function fcCopyFile




作者: 1035326373    时间: 2015-7-25 18:56
楚香饭 发表于 2015-7-25 10:54
比如说
把 a 文件夹下 b.txt 复制到 c 文件夹下 d.txt

当读取文件的路径a\b.txt是从文本文件中读取保存在字符串中时,第一种方法和最后一种方法均报错,需要怎么解决?谢谢。
作者: 楚香饭    时间: 2015-7-25 21:27
本帖最后由 楚香饭 于 2015-7-25 21:28 编辑

只说“报错”,而不提供错误信息,源代码。我实在猜不到原因。
此外,这些方法对所有文件都有效。不止是针对某一种类的文件。

作者: 糖盒love玲珑    时间: 2015-8-4 20:14
楚:FcCopyFile函数功能完成后,为啥还给其赋值为真。有何用意?是告诉用户Copy完成了?
作者: fcode    时间: 2015-8-4 20:34
糖盒love玲珑 发表于 2015-8-4 20:14
楚:FcCopyFile函数功能完成后,为啥还给其赋值为真。有何用意?是告诉用户Copy完成了? ...

如果中途 return,则返回值为 假。表示文件没有复制。

这可能是:
1.如果选择不覆盖,且文件存在。
2.原始文件或目标文件之中的至少一个打开失败。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2