如题。
小弟刚学vb不久。
昨天试着写个 LAN  (S/C) 发送文件的程序,
但写了之后才知道,只可以传送 选定更目录下的文件。
今天早上想把这个问题解决了,但研究到现在还没结果,谁帮下小弟。
写段代码,把 d:\sss (例如) 目录下的所以文件及其嵌套目录和文件,以完整单个路径存到个数组中?(例如, d:\sss\cc.exe ; d:\sss\下一目录\ccs.exe ......)等。

解决方案 »

  1.   

    Dim fso
    Dim fn As String
    Dim fns As StringPrivate Sub Command1_Click()
    Dim fd As String
    Set fso = CreateObject("Scripting.FileSystemObject")
    fd = "C:\x"
    Call getFilenm(fd)
    fns=split(fn,chr(10))
    End SubFunction getFilenm(fdnm As String)
    Dim obFd, fl, sfd
    Set obFd = fso.GetFolder(fdnm)
      For Each fl In obFd.Files
         fn = fn & fdnm & "\" & fl.Name & Chr(10)
      Next
    If obFd.SubFolders.Count > 0 Then
      For Each sfd In obFd.SubFolders
        Call getFilenm(sfd.Path)
      Next
    End If
    End Function
      

  2.   

    似乎要先引用FileSystemObject才能用吧
      

  3.   

    一个按钮,一个TextBox和一个ListBox,其中,TextBox应设置为多行。
    Option Explicit'查找第一个文件的API
    Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
    '查找下一个文件的API
    Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
    '获取文件属性的API
    Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
    '关闭查找文件的API
    Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
    '以下为调用浏览文件夹窗口的API
    Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
    Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
    Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
    Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
    '常量
    Const MAX_PATH = 260
    Const MAXDWORD = &HFFFF
    Const INVALID_HANDLE_VALUE = -1
    Const FILE_ATTRIBUTE_ARCHIVE = &H20
    Const FILE_ATTRIBUTE_DIRECTORY = &H10
    Const FILE_ATTRIBUTE_HIDDEN = &H2
    Const FILE_ATTRIBUTE_NORMAL = &H80
    Const FILE_ATTRIBUTE_READONLY = &H1
    Const FILE_ATTRIBUTE_SYSTEM = &H4
    Const FILE_ATTRIBUTE_TEMPORARY = &H100
    Const BIF_RETURNONLYFSDIRS = 1
    Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
    End Type
    '定义类(用于查找文件)
    Private Type WIN32_FIND_DATA
     dwFileAttributes As Long
     ftCreationTime As FILETIME
     ftLastAccessTime As FILETIME
     ftLastWriteTime As FILETIME
     nFileSizeHigh As Long
     nFileSizeLow As Long
     dwReserved0 As Long
     dwReserved1 As Long
     cFileName As String * MAX_PATH
     cAlternate As String * 14
    End Type
    '定义类(用于浏览文件夹窗口)
    Private Type BrowseInfo
     hWndOwner As Long
     pIDLRoot As Long
     pszDisplayName As Long
     lpszTitle As Long
     ulFlags As Long
     lpfnCallback As Long
     lParam As Long
     iImage As Long
    End Type
    '自定义函数
    Function StripNulls(OriginalStr As String) As String
     If (InStr(OriginalStr, Chr(0)) > 0) Then
      OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
     End If
     StripNulls = OriginalStr
    End Function
    '自定义函数
    Function FindFilesAPI(path As String, SearchStr As String, FileCount As Integer, _
    DirCount As Integer)
    Dim FileName As String ' 文件名
    Dim DirName As String ' 子目录名
    Dim dirNames() As String ' 目录数组
    Dim nDir As Integer ' 当前路径的目录数
    Dim i As Integer ' 循环计数器变量
    Dim hSearch As Long ' 搜索句柄变量
    Dim WFD As WIN32_FIND_DATA
    Dim Cont As Integer
    If Right(path, 1) <> "\" Then path = path & "\"
    '搜索子目录
     nDir = 0
     ReDim dirNames(nDir)
     Cont = True
     hSearch = FindFirstFile(path & "*", WFD)
     If hSearch <> INVALID_HANDLE_VALUE Then
      Do While Cont
       DirName = StripNulls(WFD.cFileName)
       If (DirName <> ".") And (DirName <> "..") Then
        If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
         dirNames(nDir) = DirName
         DirCount = DirCount + 1
         nDir = nDir + 1
         ReDim Preserve dirNames(nDir)
        End If
       End If
       Cont = FindNextFile(hSearch, WFD) '获取下一个子目录
      Loop
      Cont = FindClose(hSearch)
     End If
     ' 遍历目录并累计文件总数
     hSearch = FindFirstFile(path & SearchStr, WFD)
     Cont = True
     If hSearch <> INVALID_HANDLE_VALUE Then
      While Cont
       FileName = StripNulls(WFD.cFileName)
       If (FileName <> ".") And (FileName <> "..") Then
        FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow
        FileCount = FileCount + 1
        List1.AddItem path & FileName
       End If
       Cont = FindNextFile(hSearch, WFD) ' 获取下一个文件
      Wend
      Cont = FindClose(hSearch)
     End If
     '如果子目录存在则遍历之
     If nDir > 0 Then
      For i = 0 To nDir - 1
       FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "\", _
    SearchStr, FileCount, DirCount)
      Next i
     End If
    End Function
    '查找按钮代码
    Sub Command1_Click()
     Dim SearchPath As String, FindStr As String
     Dim FileSize As Long
     Dim NumFiles As Integer, NumDirs As Integer
     Dim iNull As Integer, lpIDList As Long, lResult As Long
     Dim sPath As String, udtBI As BrowseInfo
     With udtBI
      '设置浏览窗口
      .hWndOwner = Me.hWnd
      '返回选中的目录
      .ulFlags = BIF_RETURNONLYFSDIRS
     End With
     '调出浏览窗口
     lpIDList = SHBrowseForFolder(udtBI)
     If lpIDList Then
      sPath = String$(MAX_PATH, 0)
      '获取路径
      SHGetPathFromIDList lpIDList, sPath
      '释放内存
      CoTaskMemFree lpIDList
      iNull = InStr(sPath, vbNullChar)
      If iNull Then
       sPath = Left$(sPath, iNull - 1)
      End If
     End If
     Screen.MousePointer = vbHourglass
     List1.Clear
     SearchPath = sPath '选中的目录为搜索的起始路径
     FindStr = "*.*" '搜索所有类型的文件(此处可另作定义)
     FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs)
     Text1.Text = "查找到的文件数:" & NumFiles & vbCrLf & "查找的目录数:" & _
    NumDirs + 1 & vbCrLf & "文件大小总共为:" & vbCrLf & _
    Format(FileSize, "#,###,###,##0") & "字节"
     Screen.MousePointer = vbDefault
    End Sub
      

  4.   

    小弟在请教以下,上面的代码执行后,也把 目录列到了list中,为了取掉这点。我在下面的代码改变问了。
     ' 遍历目录并累计文件总数
    原句 If (FileName <> ".") And (FileName <> "..")  Then
    改为
    If (FileName <> ".") And (FileName <> "..") and UBound(Split(FileName, ".")) > 0 Then
    但有很些文件是没有扩展名的,这又如何区别呢?