Fortran Coder

查看: 21150|回复: 5
打印 上一主题 下一主题

[文件读写] Fortran复制文件

[复制链接]

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

楼主
发表于 2015-7-25 10:54:45 | 显示全部楼层
本帖最后由 楚香饭 于 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



712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2015-7-25 21:27:06 | 显示全部楼层
本帖最后由 楚香饭 于 2015-7-25 21:28 编辑

只说“报错”,而不提供错误信息,源代码。我实在猜不到原因。
此外,这些方法对所有文件都有效。不止是针对某一种类的文件。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-10 21:57

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表