Fortran Coder

查看: 21637|回复: 24
打印 上一主题 下一主题

[绘图界面库] 请问怎么获得包括子文件夹的所有文件名

[复制链接]

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
跳转到指定楼层
楼主
发表于 2017-9-12 07:29:19 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
求问????????????
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
25#
 楼主| 发表于 2017-9-14 20:11:18 | 只看该作者
本帖最后由 shrine 于 2017-9-14 21:29 编辑
kyra 发表于 2017-9-14 07:47
你需要在 ToDoOneFile 函数中完成重命名,因为它收到的文件名是绝对路径的。而 stInfo.Name 是相对路径。 ...

终于搞定了,谢谢

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
24#
 楼主| 发表于 2017-9-14 14:03:30 | 只看该作者
本帖最后由 shrine 于 2017-9-14 14:07 编辑
kyra 发表于 2017-9-14 07:47
你需要在 ToDoOneFile 函数中完成重命名,因为它收到的文件名是绝对路径的。而 stInfo.Name 是相对路径。 ...



好的

259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
23#
发表于 2017-9-14 07:47:31 | 只看该作者
你需要在 ToDoOneFile 函数中完成重命名,因为它收到的文件名是绝对路径的。而 stInfo.Name 是相对路径。

评分

参与人数 1贡献 +10 收起 理由
fcode + 10 赞一个!

查看全部评分

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
22#
 楼主| 发表于 2017-9-13 21:36:18 | 只看该作者
本帖最后由 shrine 于 2017-9-13 21:53 编辑
kyra 发表于 2017-9-13 20:42
那就不知道为啥了。反正我这里是OK的。

你试试自己操作字符串改名吧。

RENAMEFILEQQ( 'a.txt', 'b.txt' )

在这个程序中,是不是RENAMEFILEQQ( stInfo.Name, 'b.txt' )?

259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
21#
发表于 2017-9-13 20:42:24 | 只看该作者
那就不知道为啥了。反正我这里是OK的。

你试试自己操作字符串改名吧。

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
20#
 楼主| 发表于 2017-9-13 20:19:04 | 只看该作者

[Fortran] 纯文本查看 复制代码
Program www_fcode_cn
   Implicit None
   integer :: n
   External ToDoOneFile
   call DoWithWildcard( "j:\123\*" , ToDoOneFile , n )
   write(*,*) '共',n,'个文件'
    End Program www_fcode_cn 

!Subroutine ToDoOneFile( cFile , iLoop )
!   Character( Len = * ) , Intent( IN ) :: cFile
!   Integer , Intent( IN ) :: iLoop
!   Write( * , * ) '第',iLoop,'个文件:',cFile
!End Subroutine ToDoOneFile

Subroutine ToDoOneFile( cFile , iLoop )
  use , intrinsic :: ISO_C_Binding
  
  INTERFACE
    FUNCTION GetShortPathName(lpszLongPath,lpszShortPath,cchBuffer)
      import
      integer :: GetShortPathName ! DWORD
      !DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'GetShortPathNameA' :: GetShortPathName
      !DEC$ ATTRIBUTES REFERENCE, ALLOW_NULL :: lpszLongPath
      character*(*) lpszLongPath ! LPCSTR lpszLongPath
      !DEC$ ATTRIBUTES REFERENCE, ALLOW_NULL :: lpszShortPath
      character*(*) lpszShortPath ! LPSTR lpszShortPath
      integer cchBuffer ! DWORD cchBuffer
    END FUNCTION
  END INTERFACE

   Character( Len = * ) , Intent( IN ) :: cFile
   Integer , Intent( IN ) :: iLoop
   integer :: k
   character(len=512) :: sFile
   k = GetShortPathName( trim(cFile)//c_null_char , sFile , len(sFile) ) 
   Write( * , * ) '第',iLoop,'个文件:', sFile(:k)
End Subroutine ToDoOneFile
    
recursive Subroutine DoWithWildcard(cWildcard,CallBack,iTotal)
   !// 下一句代码,如果是 Compaq 或 Digital,需改为 Use DFLib
   Use IFPort , only : GetFileInfoQQ , GetLastErrorQQ , FILE$INFO , FILE$LAST , FILE$ERROR , FILE$FIRST , ERR$NOMEM , ERR$NOENT , FILE$DIR
   Implicit None
   !character(len=256) a
   integer::zl
   Interface
     Subroutine CallBack( cFile , iLoop )
       Character( Len = * ) , Intent( IN ) :: cFile
       Integer , Intent( IN ) :: iLoop
     End Subroutine CallBack
   End Interface
   Character( Len = * ) , Intent( IN ) :: cWildcard
   Integer , Intent( OUT ) :: iTotal
   Type (FILE$INFO) :: stInfo
   Integer(4) :: iWildhandle , iLength , iRet
   iWildhandle = FILE$FIRST
   iTotal = 0
   Do While (.TRUE.)
       iLength = GetFileInfoQQ( cWildCard , stInfo , iWildhandle )
       If (( iWildhandle == FILE$LAST) .OR.( iWildhandle == FILE$ERROR )) then
         Select Case (GetLastErrorQQ())
         Case (ERR$NOMEM)  !//内存不足
           iTotal = - 1
           return
         Case (ERR$NOENT)  !//碰到通配符序列尾
           return
         Case Default
           iTotal = 0
           return
         End Select
       End If
       iLength = index( cWildcard , "\" , .true. )

    If ( ( stInfo%permit.AND.FILE$DIR ) == 0 ) then
      call CallBack( cWildcard(:iLength)//trim(stInfo%Name) , iTotal + 1 )
      iTotal = iTotal + 1
      !zl=len(stInfo.Name)
      !write(*,*)stInfo.Name
      !write(*,*)zl
    Else 
        if(stInfo%Name(1:1) /= "." ) then                
        call DoWithWildcard( cWildcard(:iLength)//trim(stInfo%Name)//"\"//cWildcard(iLength+1:) , CallBack , iTotal ) !!!文件夹,递归
        endif
    End If
   End Do

 End Subroutine DoWithWildcard


259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
19#
发表于 2017-9-13 19:57:04 | 只看该作者
截图或拍照

86

帖子

36

主题

0

精华

专家

F 币
353 元
贡献
221 点
18#
 楼主| 发表于 2017-9-13 19:36:44 | 只看该作者
本帖最后由 shrine 于 2017-9-13 19:38 编辑
kyra 发表于 2017-9-13 18:43
你的IVF可能版本比较早,没有导入这个函数。你需要手动导入。

[mw_shl_code=fortran,true]

不行,输出的还是整个文件名

我的ivf是2017

259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
17#
发表于 2017-9-13 18:43:02 | 只看该作者
你的IVF可能版本比较早,没有导入这个函数。你需要手动导入。

[Fortran] 纯文本查看 复制代码
Subroutine ToDoOneFile( cFile , iLoop )
  use , intrinsic :: ISO_C_Binding
  
  INTERFACE
    FUNCTION GetShortPathName(lpszLongPath,lpszShortPath,cchBuffer)
      import
      integer :: GetShortPathName ! DWORD
      !DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'GetShortPathNameA' :: GetShortPathName
      !DEC$ ATTRIBUTES REFERENCE, ALLOW_NULL :: lpszLongPath
      character*(*) lpszLongPath ! LPCSTR lpszLongPath
      !DEC$ ATTRIBUTES REFERENCE, ALLOW_NULL :: lpszShortPath
      character*(*) lpszShortPath ! LPSTR lpszShortPath
      integer cchBuffer ! DWORD cchBuffer
    END FUNCTION
  END INTERFACE

   Character( Len = * ) , Intent( IN ) :: cFile
   Integer , Intent( IN ) :: iLoop
   integer :: k
   character(len=512) :: sFile
   k = GetShortPathName( trim(cFile)//c_null_char , sFile , len(sFile) ) 
   Write( * , * ) '第',iLoop,'个文件:', sFile(:k)
End Subroutine ToDoOneFile
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-11-24 00:39

Powered by Tencent X3.4

© 2013-2024 Tencent

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