小弟写了一个简单的函数,显示一个目录下所有的目录和文件
不知为何如果目录结构出现3层则出现问题,请教高手
小弟的调用方式为:ShowFolderAndFiles "C:\test\"
test目录就一个目录
////////////////////////////////////////////////////////////////////////
'显示一个目录下所有的文件,如果是目录的话,则继续调用这个函数
Public Sub ShowFolderAndFiles(FolderPath As String)
' 判断是否为目录,如果不是目录则不处理
If Dir(FolderPath, vbDirectory) = "" Then Exit Sub
' 如果为目录则打印处理目录
Debug.Print FolderPath
Dim CurFolder As String
Dim FolderName As String
FolderName = Dir(FolderPath, vbDirectory)
While (FolderName <> "")
If FolderName <> "." And FolderName <> ".." Then
If (GetAttr(FolderPath & FolderName) And vbDirectory) = vbDirectory Then
If CurFolder = "" Then
CurFolder = FolderPath & FolderName & "\"
Else
CurFolder = CurFolder & FolderName & "\"
End If
'如果是子目录则调用本身继续操作
ShowFolderAndFiles CurFolder
Else
'如果是文件则打印出文件的名称
Debug.Print FolderName
End If
End If
FolderName = Dir
Wend
End Sub
不知为何如果目录结构出现3层则出现问题,请教高手
小弟的调用方式为:ShowFolderAndFiles "C:\test\"
test目录就一个目录
////////////////////////////////////////////////////////////////////////
'显示一个目录下所有的文件,如果是目录的话,则继续调用这个函数
Public Sub ShowFolderAndFiles(FolderPath As String)
' 判断是否为目录,如果不是目录则不处理
If Dir(FolderPath, vbDirectory) = "" Then Exit Sub
' 如果为目录则打印处理目录
Debug.Print FolderPath
Dim CurFolder As String
Dim FolderName As String
FolderName = Dir(FolderPath, vbDirectory)
While (FolderName <> "")
If FolderName <> "." And FolderName <> ".." Then
If (GetAttr(FolderPath & FolderName) And vbDirectory) = vbDirectory Then
If CurFolder = "" Then
CurFolder = FolderPath & FolderName & "\"
Else
CurFolder = CurFolder & FolderName & "\"
End If
'如果是子目录则调用本身继续操作
ShowFolderAndFiles CurFolder
Else
'如果是文件则打印出文件的名称
Debug.Print FolderName
End If
End If
FolderName = Dir
Wend
End Sub
FolderName = Dir
我在每一个递归调用返回的地方加一句这个,就可以返回到原来的目录中,但是这时又会重复遍历已经遍历的文件夹,而且文件夹的名字还会出错,这个不知道怎么改才好
Public Sub ShowFolderAndFiles(FolderPath As String)
' 判断是否为目录,如果不是目录则不处理
If Dir(FolderPath, vbDirectory) = "" Then Exit Sub
' 如果为目录则打印处理目录
List1.AddItem FolderPath
Dim CurFolder As String
Dim FolderName As String
Dim sFile As Collection
Dim i As Long
Set sFile = New Collection
FolderName = Dir(FolderPath, vbDirectory)
While (FolderName <> "")
If FolderName <> "." And FolderName <> ".." Then
If (GetAttr(FolderPath & FolderName) And vbDirectory) = vbDirectory Then
If CurFolder = "" Then
CurFolder = FolderPath & FolderName & "\"
Else
CurFolder = CurFolder & FolderName & "\"
End If
'如果是子目录则加入集合
sFile.Add CurFolder
Else
'如果是文件则打印出文件的名称
List1.AddItem FolderName
End If
End If
FolderName = Dir
Wend
If sFile.Count > 0 Then
For i = 1 To sFile.Count
ShowFolderAndFiles sFile.Item(i)
Next
End If
Set sFile = Nothing
End Sub
Public Sub BianLi(ByVal Path$, ByRef cTemp As Collection)
Dim fso, objFolder, objSubFolders, objFile, objSubFolder, sMax As Long, nowPathName$, nowPath$
Set fso = CreateObject("scripting.filesystemobject")
If Right(Path, 1) <> "\" Then Path = Path & "\"
Set objFolder = fso.GetFolder(Path)
Set objFiles = objFolder.Files
For Each objFile In objFiles
DoEvents
sMax = cTemp.Count + 1
nowPathName = CStr(Path) & objFile.Name
nowPathName = nowPathName & "||" & FileLen(nowPathName)
cTemp.Add nowPathName, CStr(sMax)
Next
Set objSubFolders = objFolder.Subfolders
For Each objSubFolder In objSubFolders
DoEvents
nowPath = Path & objSubFolder.Name
If Right(nowPath, 1) <> "\" Then nowPath = nowPath & "\"
BianLi nowPath, cTemp
Next
Set objFolder = Nothing
Set objSubFolders = Nothing
Set fso = Nothing
End Sub我想上面的代码,对你有用!~
Public Sub ShowFolderAndFiles(FolderPath As String)
' 判断是否为目录,如果不是目录则不处理
If Dir(FolderPath, vbDirectory) = "" Then Exit Sub
Dim FolderNameList As New Collection
' 如果为目录则打印处理目录
Print #1, Mid(FolderPath, 56, 60)
Dim CurFolder As String
Dim FolderName As String
FolderName = Dir(FolderPath, vbDirectory)
While (FolderName <> "")
If FolderName <> "." And FolderName <> ".." Then
If (GetAttr(FolderPath & FolderName) And vbDirectory) = vbDirectory Then
CurFolder = FolderPath & FolderName & "\"
'如果是子目录则调用本身继续操作
FolderNameList.Add CurFolder
Else
'如果是文件则打印出文件的名称
If Right(FolderName, 4) = "java" Then Print #1, Tab(10); FolderName
End If
End If
FolderName = Dir
Wend
Dim i As Integer
For i = 1 To FolderNameList.Count
ShowFolderAndFiles FolderNameList(i)
Next i
Set FolderNameList = Nothing
End Sub