| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
免费IT实战开发视频教程合集分享千里之行 始于足下
共有 1192 人关注过本帖, 1 人收藏
标题:遍历指定盘符下的所有文件及文件夹并获取所有信息,欢迎交流提速!
只看楼主 加入收藏
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:378
专家分:888
注 册:2004-11-23
结帖率:100%
  已结贴   问题点数:20  回复次数:29   
遍历指定盘符下的所有文件及文件夹并获取所有信息,欢迎交流提速!
本代码学习了网上前辈和吹版的代码,再次向他们表示感谢和敬意!

程序代码:
********************************************************************************
***功能:遍历指定盘符下的所有文件及文件夹,并获取所有相关信息。
***文件名:ScanFile.Prg
***调用格式:ScanFile('D:')
********************************************************************************
PARAMETERS cDrvmc
cDrvmc=UPPER(ALLTRIM(cDrvmc))
nOldsec=SECONDS( )
? '磁盘[ '+cDrvmc+' ]开始扫描...',DATETIME()
DIMENSION Myarrtol(1,5)  &&定义总数组
Myarrtol(1,1)=cDrvmc
Myarrtol(1,2)=''
Myarrtol(1,3)=DATE()
Myarrtol(1,4)=TIME()
Myarrtol(1,5)='....D'
nArrlen=ALEN(Myarrtol,1)  &&总数组的长度
nIarr=1
DO WHILE nIarr<=nArrlen   &&开始扫描指定磁盘
   IF 'D'$Myarrtol(nIarr,5)   &&是不是目录
      nNum=ADIR(Myarrtmp,Myarrtol(nIarr,1)+'*.*','RASHD')  &&获取指定目录下所有信息
      IF nNum#0
         DIMENSION Myarrtol(nArrlen+nNum+IIF(nIarr<=1,0,-2),5)  &&重新定义总数组
         FOR I=IIF(nIarr<=1,1,3) TO nNum    &&记录全路径并将新获取数据添加到总数组中,除根目录外跳过.和..
             Myarrtmp(I,1)=Myarrtol(nIarr,1)+Myarrtmp(I,1)+IIF('D' $ Myarrtmp(I,5),'\','')   &&获取全路径
*             WAIT WINDOW [color=#FF0000]'正在搜索:'+DISPLAYPATH(ALLTRIM(Myarrtmp(I,1)),100) NOWAIT    &&显示扫描对象[/color]
             FOR nI=1 TO 5
                 Myarrtol(nArrlen+IIF(nIarr<=1,I,I-2),nI)=Myarrtmp(i,nI)   &&将获取指定目录下的所有信息添加至总数组
             ENDFOR
         ENDFOR
      ENDIF
      RELEASE Myarrtmp
   ENDIF
   nArrlen=ALEN(Myarrtol,1)
   nIarr=nIarr+1
ENDDO
? '共找到[ '+TRANSFORM(ALEN(Myarrtol,1))+' ]条数据!'
? '扫描磁盘用时[ '+TRANSFORM(SECONDS()-nOldsec)+' ]秒!'
CREATE CURSOR Mydbf (wjmc C(254),wjcd N(20),wjrq D,wjshj C(10),wjsx C(6))   &&创建游标
APPEND FROM ARRAY Myarrtol    &&将总数组数据添加至游标中
&&获取了指定硬盘下的所有文件及文件夹信息后即可做任何处理,这个要看你想做什么了?呵呵...

1.红色行如果执行的话,会大大降低速度,建议不显示为好!
2.可以把自己需要的条件加入代码中,即可满足自己的需要!
3.正在完善获取每个文件的文件版本等相关信息,可提供更加全面的数据支持。

总结:用数组保存数据,提高了速度!具体速度自己测试吧,欢迎回复测试结果!谢谢!

[此贴子已经被作者于2018-7-23 23:41编辑过]

2018-07-23 23:23
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:378
专家分:888
注 册:2004-11-23
  得分:0 
沙发!
测试电脑配置:

重新启动电脑后第一次扫描时间:

第二次扫描时间:
附件: 您没有浏览附件的权限,请 登录注册
2018-07-23 23:40
zyxxzhyg
Rank: 3Rank: 3
来 自:江西
等 级:论坛游侠
威 望:3
帖 子:47
专家分:113
注 册:2014-6-26
  得分:2 
回复 2楼 hyswcyh
我的测试(win10 1803,G2020 8G内存)

第二次测试


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

附件: 您没有浏览附件的权限,请 登录注册
2018-07-24 08:14
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:378
专家分:888
注 册:2004-11-23
  得分:0 
你的很快嘛,不错。比我的机器强。
2018-07-24 12:11
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:378
专家分:888
注 册:2004-11-23
  得分:0 
测试电脑配置:


扫描时间:
附件: 您没有浏览附件的权限,请 登录注册
2018-07-24 12:54
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:163
帖 子:6329
专家分:27684
注 册:2014-5-20
  得分:0 
试试用winAPI
DECLARE LONG FindFirstFile IN Kernel32 STRING@, STRING@
DECLARE LONG FindNextFile IN Kernel32 LONG, STRING@
DECLARE LONG FindClose IN Kernel32 LONG
cPath = GETDIR()
IF EMPTY(cPath)
    RETURN
ENDIF
DIMENSION arrDIR[1], arrFile[1]
arrDIR[1] = cPath
stFD = REPLICATE(0h00,320)
nCountD = 1
nCountF = 0
FOR EACH cPath IN arrDIR
    hf = FindFirstFile(cPath + "*.*", @stFD)
    IF hf == -1
        ? "error"
       RETURN
    ENDIF
    DO WHILE .T.
        nFileAttr = CTOBIN(SUBSTR(stFD,1,4),"4RS")
        cFileName = SUBSTR(stFD,45,260)
        cFileName = LEFT(cFileName, AT(0h00,cFileName)-1)
        IF nFileAttr == 16    &&子目录
            IF !(LEFT(cFileName,1)==".")
                nCountD = nCountD + 1
                DIMENSION arrDIR[nCountD]
                arrDIR[nCountD] = cPath + cFileName + "\"
            ENDIF            
        ELSE    &&文件
            nCountF = nCountF + 1
            DIMENSION arrFile[nCountF]
            arrFile[nCountF] = cPath + cFileName
        ENDIF
        IF FindNextFile(hf, @stFD) == 0
            EXIT
        ENDIF
    ENDDO
    FindClose(hf)
ENDFOR
? ALEN(arrFile),"个文件"  
DIMENSION arrFile[nCountF,1]
CREATE CURSOR tt (fn C(240))
APPEND FROM ARRAY arrFile  
SELECT * FROM tt
2018-07-24 16:35
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:86
帖 子:2576
专家分:6316
注 册:2015-3-25
  得分:0 

百度:
Win7 中的C:\Windows\CSC\v2.0.6是什么?为什么拒绝访问?
C:\WINDOWS\CSC文件最好不要删。
C:\WINDOWS\CSC目录下的文件是"启用脱机文件"后所需要的文件,当禁用脱机文件后系统在启动时就不会去读取此目录。
  脱机文件缓存是位于 %SystemRoot%\CSC 文件夹下的文件夹结构,默认情况下处于隐藏状态。不应直接修改 CSC 文件及其包含的任何文件和子文件夹,否则可能会导致数据丢失和脱机文件功能完全崩溃
附件: 您没有浏览附件的权限,请 登录注册
2018-07-24 17:21
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:86
帖 子:2576
专家分:6316
注 册:2015-3-25
  得分:2 
用吹版的API,才找到10919个,
但用楼主的,34753个 = 31796个文件 + 2778个文件夹

附件: 您没有浏览附件的权限,请 登录注册
2018-07-24 17:57
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:378
专家分:888
注 册:2004-11-23
  得分:0 
回复 6楼 吹水佬
C盘不让扫描,出错!

需要这个程序,主要是想解决一个问题:
就是我的程序在当前计算机上是否有相关或其他版本,如果有,就删除这些文件。

目前可以解决的是:
1、有相同文件名或文件名称的可以查到;
2、关键文件或数据版本也可以查到;
3、如果修改了关键文件,如EXE文件的名称,甚至扩展名都改了,目前也可以找到;
4、压缩后的文件扫描起来就会慢很多,当然压缩加密码就不行了。

还有其他可能吗?

请大神多提宝贵意见!谢谢!


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

2018-07-24 18:01
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:378
专家分:888
注 册:2004-11-23
  得分:0 
回复 8楼 mywisdom88
这个我计算了,可以找到所有文件,和操作系统给出的结果一样。是可信的。
2018-07-24 18:04







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

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