| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
免费IT实战开发视频教程合集分享千里之行 始于足下
共有 1183 人关注过本帖, 1 人收藏
标题:遍历指定盘符下的所有文件及文件夹并获取所有信息,欢迎交流提速!
只看楼主 加入收藏
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:378
专家分:888
注 册:2004-11-23
  得分:0 
这样的数据
附件: 您没有浏览附件的权限,请 登录注册
2018-07-25 18:13
sdta
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:170
帖 子:7399
专家分:17490
注 册:2012-2-5
  得分:0 
回复 21楼 hyswcyh
你不是说用表速度慢吗,怎么现在想用表了。

坚守VFP最后的阵地
2018-07-25 19:23
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:378
专家分:888
注 册:2004-11-23
  得分:0 
不是,这是导出之后的结果,我的意思是带后边的文件信息。

获取的数据还存在数组中,到最后可以写到文件表里或者做其他用途。
2018-07-25 20:36
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:163
帖 子:6320
专家分:27650
注 册:2014-5-20
  得分:0 
以下是引用hyswcyh在2018-7-25 17:52:20的发言:

吹版,请修改程序,可以获取文件或目录的名称、大小、日期、时间和属性,以及文件的详细版本信息。

AGETFILEVERSION()函数可以获取文件版本信息。

生成的文件表加个备注字段保存文件属性信息
......
? nCountF,"个文件", nCountD,"个文件夹", nCountE,"个文件夹搜索出现异常"
CREATE CURSOR tt (FileName V(240), FileInfo M)
IF nCountF > 0
    DIMENSION arrFile[nCountF,1]
    APPEND FROM ARRAY arrFile  
    REPLACE FileInfo WITH _GetFileInfo(FileName) ALL IN "tt"
    GO TOP
    BROWSE
ENDIF

FUNCTION _GetFileInfo(cFileName)
    ** 获取文件信息
    ** cRet = 文件信息
    RETURN cRet
ENDFUNC
2018-07-25 22:09
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:378
专家分:888
注 册:2004-11-23
  得分:0 
谢谢!明天根据19楼思路再次优化我的代码!?看看效果!
2018-07-25 22:40
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:163
帖 子:6320
专家分:27650
注 册:2014-5-20
  得分:0 
回复 25楼 hyswcyh
可以用SHLL获取文件的详细信息,但速度有点慢。
示例:
oShell = CREATEOBJECT("Shell.Application")
_GetFileInfo(oShell, GETFILE())
RETURN

FUNCTION _GetFileInfo(oShell, cFileName)
    IF !FILE(cFileName)
        RETURN ""
    ENDIF
    LOCAL oFolder, oFolderItem
    LOCAL i, cName, cValue
    oFolder = oShell.Namespace(JUSTPATH(cFileName))
    IF oFolder==NULL
        RETURN ""
    ENDIF
    oFolderItem = oFolder.ParseName(JUSTFNAME(cFileName))
    FOR i=0 TO 330
        cName = oFolder.GetDetailsOf(NULL, i)
        IF !EMPTY(cName)
            cValue = oFolder.GetDetailsOf(oFolderItem, i)
            IF !EMPTY(cValue)
                ? TRANSFORM(i) + "." + cName + " : " + cValue
            ENDIF
        ENDIF
    ENDFOR
ENDFUNC
2018-07-26 05:28
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:378
专家分:888
注 册:2004-11-23
  得分:0 
谢谢吹版!这么早!

AGETFILEVERSION()函数可以获取文件版本信息,不用麻烦!

[此贴子已经被作者于2018-7-26 08:35编辑过]

2018-07-26 08:34
csyx
Rank: 2
等 级:论坛游民
威 望:3
帖 子:11
专家分:54
注 册:2018-3-13
  得分:2 
何必搞这么复杂,直接用 windows 的 dir 命令,速度也不比用 win32api 慢多少,代码简单明了,基本不用考虑错误处理
要是嫌黑窗口不好看,用木瓜myfll中的函数隐藏运行就好
程序代码:
Function ScanFile3(cDrv)
    Local ss, cmd, temp
    ss = Seconds()
    Set Library To myfll.fll
    temp = sys(2015) + '.txt'
    cmd = '/c dir ' + cDrv + ' /s/a:-d/b >' + temp
    ShellExecWait('cmd', cmd, 0)
    Create Cursor sf3 (name V(250))
    Append From (temp) sdf
    Erase (temp)
    ? Textmerge(' <<cDrv>>   找到 <<Recc()>> 个文件,耗时 <<Seconds()-ss>> 秒')
EndFunc

要获取详细点的信息,加一倍左右的时间
程序代码:
Function ScanFile3(cDrv)
    Local ss, cmd, temp, nd, cExact
    ss = Seconds()
    temp = sys(2015) + '.txt'
    cmd = '/c dir ' + cDrv + ' /s/a/-c/o:gn >' + temp
    Set Library To myfll.fll
    ShellExecWait('cmd', cmd, 0)
    Create Cursor sf3 (date C(12), time C(9), size C(15), name V(250))
    Append From (temp) sdf
    Erase (temp)
    Select Cast(date as D) date, Cast(time as C(5)) time, Cast(Alltrim(size) as V(10)) size, name ;
        from sf3 where (date not Like ' %') and (name not in ('.', '..')) into cursor sf3
    cExact = Set("Exact")
    Set Exact off
    Count to nd for size = '<'
    Set Exact &cExact
    ? Textmerge(' <<cDrv>>   <<Recc()-nd>> 个文件,<<nd>> 个文件夹,耗时 <<Seconds()-ss>> 秒')
EndFunc


[此贴子已经被作者于2018-7-26 13:11编辑过]

2018-07-26 10:53
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:378
专家分:888
注 册:2004-11-23
  得分:0 
楼上的兄弟,你提供结果的格式不是我想要的,但是速度确实快了。你的代码能不能实现我要的结果?

修改后,好像也不快!但是确实循环的次数少了,但是数组多了,占用内存的数量增加。

程序代码:
********************************************************************************
***功能:遍历指定盘符下的所有文件及文件夹,并获取所有相关信息。
***文件名:ScanFileTol.Prg
***调用格式:ScanFileTol('D:')
********************************************************************************
PARAMETERS cDrvmc
cDrvmc=UPPER(ALLTRIM(cDrvmc))
nOldsec=SECONDS()
?
? '[ '+cDrvmc+' ]开始扫描...',DATETIME()
DIMENSION MyarrDir(1,5),MyarrFile(1,5),MyarrErr(1)
MyarrDir(1,1)=ADDBS(cDrvmc)
MyarrDir(1,2)=''
MyarrDir(1,3)=DATE()
MyarrDir(1,4)=TIME()
MyarrDir(1,5)='....D'
STORE 1 TO nCountDir
STORE 0 TO nCountFile,nCountErr
nIarr=1
DO WHILE nIarr<=nCountDir
   nNum=ADIR(Myarrtmp,MyarrDir(nIarr,1)+'*.*','RASHD')
   IF nNum < 1
      nCountErr = nCountErr + 1
      DIMENSION MyarrErr[nCountErr]
      MyarrErr[nCountErr] = "Error:" + MyarrDir(nIarr,1)
   ELSE
      FOR I=IIF(nIarr<=1,1,3) TO nNum
          IF 'D'$Myarrtmp(I,5)
             Myarrtmp(I,1)=MyarrDir(nIarr,1)+Myarrtmp(I,1)+'\'
             nCountDir=nCountDir+1
             DIMENSION MyarrDir(nCountDir,5)
             FOR ai=1 TO 5
                 MyarrDir(nCountDir,ai)=Myarrtmp(i,ai)
             ENDFOR
          ELSE
             Myarrtmp(I,1)=MyarrDir(nIarr,1)+Myarrtmp(I,1)
             nCountFile=nCountFile+1
             DIMENSION MyarrFile(nCountFile,5)
             FOR ai=1 TO 5
                 MyarrFile(nCountFile,ai)=Myarrtmp(i,ai)
             ENDFOR
          ENDIF
      ENDFOR
   ENDIF
   nIarr=nIarr+1
ENDDO
? '[ '+cDrvmc+' ]扫描完成...',DATETIME()
? '[ '+cDrvmc+' ]共找到[ '+TRANSFORM(nCountFile+nCountDir)+' ]个对象,其中文件[ '+TRANSFORM(nCountFile)+' ]个,文件夹[ '+TRANSFORM(nCountDir)+' ]个!用时[ '+TRANSFORM(SECONDS()-nOldsec)+' ]秒!'
CREATE CURSOR Mydbf (wjmc C(254),wjcd N(20),wjrq D,wjshj C(10),wjsx C(6))
APPEND FROM ARRAY MyarrDir
APPEND FROM ARRAY MyarrFile
APPEND FROM ARRAY MyarrErr


[此贴子已经被作者于2018-7-27 08:11编辑过]

2018-07-27 00:33
sunfail
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-3-23
  得分:0 
收藏,学习了,谢谢
2018-08-03 20:30







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036723 second(s), 9 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved