Fortran Coder

查看: 21064|回复: 5

[文件读写] Fortran复制文件

[复制链接]

12

帖子

5

主题

0

精华

入门

F 币
72 元
贡献
43 点
发表于 2015-7-24 21:41:33 | 显示全部楼层 |阅读模式
用Fortran处理数据时,需要将当前目录下子目录的文件复制到当前另外子目录下,需要复制的文件的目录从文本文件中读取(只给出子目录名及需要复制文件的名称\a\b.txt)。用Fortran怎么实现?最好用类似systemqq的命令。

709

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
596 元
贡献
305 点

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

发表于 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



12

帖子

5

主题

0

精华

入门

F 币
72 元
贡献
43 点
 楼主| 发表于 2015-7-25 18:56:37 | 显示全部楼层
楚香饭 发表于 2015-7-25 10:54
比如说
把 a 文件夹下 b.txt 复制到 c 文件夹下 d.txt

当读取文件的路径a\b.txt是从文本文件中读取保存在字符串中时,第一种方法和最后一种方法均报错,需要怎么解决?谢谢。

709

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
596 元
贡献
305 点

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

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

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

15

帖子

2

主题

0

精华

新人

F 币
142 元
贡献
84 点
发表于 2015-8-4 20:14:33 来自移动端 | 显示全部楼层
楚:FcCopyFile函数功能完成后,为啥还给其赋值为真。有何用意?是告诉用户Copy完成了?

1947

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1295 元
贡献
545 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2015-8-4 20:34:39 | 显示全部楼层
糖盒love玲珑 发表于 2015-8-4 20:14
楚:FcCopyFile函数功能完成后,为啥还给其赋值为真。有何用意?是告诉用户Copy完成了? ...

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

这可能是:
1.如果选择不覆盖,且文件存在。
2.原始文件或目标文件之中的至少一个打开失败。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-3-28 19:10

Powered by Tencent X3.4

© 2013-2024 Tencent

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