设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

不使用API获得指定文件夹文件列表

1970-1-1 08:00| 发布者: goodidea『文章』| 查看: 2166| 评论: 0

最近为一个歌城安装vod系统时,需要找出不同目录的重复歌曲和损坏歌曲文件,这是我编写的2种不使用API列出指定文件夹下所有文件(包含子文件夹)的方法。 两种方法都支持本地磁盘目录(形如: E:\Folder\)和网络共享目录(形如: \\server\Share\)

第一种, 利用Scripting.FileSystemObject对象。此法优点是可以同时得到文件大小和属性,缺点是某些系统目录也可能被列出。请先引用Microsoft Scripting Runtime (%system%\scrrun.dll)
Public Sub SaveFileListOfPath(strFileFullPath As String)
'goodidea 2004/10/02

    Dim strFileFullName As String
    Dim fso As New Scripting.FileSystemObject '申明并实例化FileSystemObject对象
    Dim d As Scripting.Folder
    Dim sd As Scripting.Folder
    Dim f As Scripting.File
   
    On Error Resume Next
    Forms(0).lblStatus.Caption = "正在连接到: " & strFileFullPath
    Forms(0).Repaint

    Set d = fso.GetFolder(strFileFullPath) '实例化Folder对象
   
    'Debug.Print Err.Number, Err.Description
    i = 0
    For Each f In d.Files '循环文件夹中每一个文件
           
            If Err.Number = 70 Then Debug.Print "拒绝: ", d.Path
            strFileFullName = f.Path
            If i >= 10 Then '适当的时候给出一些提示
                me.lblStatus.Caption = strFileFullName
                me.Repaint
                i = 0
            End If
            i = i + 1
     '把文件信息写入到表中, g_cnn是一个公共的ADO.Connection对象
             g_cnn.Execute "insert into [tbl_file_list_temp] ([filename],[FullName],[size])" & _
                " values(""" & f.Name & """,""" & f.Path & """, " & f.Size & ")"

    Next
    Set f = Nothing

    For Each sd In d.SubFolders '循环每一个子文件夹
        Debug.Print sd.Path, sd.Type, sd.Attributes, sd.ShortName
        If UCase(sd.ShortName) <> "RECYCLER" Then
            Call SaveFileListOfPath(sd.Path) '递归调用,获得文件列表
        End If
    Next
   
    me.lblStatus.Caption = "总文件个数: " & g_cnn.Execute("select count(*) from [tbl_file_list_temp] ").GetString
    me.Repaint
   
    Set fso = Nothing
    Set d = Nothing
    Set sd = Nothing

End Sub


第二种, 利用Office.FileSearch对象。此法优点是搜索Office文件更加方便,搜索子目录无需递归。请先引用Microsoft Office ojbect Library (%system%\scrrun.dll)
Public Sub SaveFileListOfPath2(strFileFullPath As String)
'goodidea 2004/10/01

    Dim strFileFullName As String
    Dim objFileSearch  As Office.FileSearch

    Set objFileSearch = Application.FileSearch '获取FileSearch对象
    With objFileSearch

        .NewSearch '开始新的搜索
        .MatchAllWordForms = True 
        .SearchSubFolders = True '搜索子目录
        .FileType = msoFileTypeAllFiles '搜索的文件类型为所有文件
        .LookIn = strFileFullPath '在指定目录中搜索
        me.lblStatus.Caption = "正在连接 : " & strFileFullPath
        me.Repaint
        .Execute msoSortByFileName '执行搜索

        For i = .FoundFiles.Count To 1 Step -1 '循环搜索结果
            strFileFullName = .FoundFiles(i)
            If i Mod 5 = 0 Then '给出提示
                me.lblStatus.Caption = strFileFullName
                me.Repaint
            End If
     '把搜索结果写入表中, g_cnn是一个公共的ADO.Connection对象
            g_cnn.Execute "insert into [tbl_file_list_temp] ([filename],[FullName])" & _
                " values(""" & gf_getFileNameOfFullName(strFileFullName) & """,""" & strFileFullName & """)"
        Next

    End With
    me.lblStatus.Caption = "总文件个数: " & g_cnn.Execute("select count(*) from [tbl_file_list_temp] ").GetString
    me.Repaint

    Set objFileSearch = Nothing

End Sub

最新评论

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-30 15:46 , Processed in 0.079742 second(s), 16 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部