Рекурсия - это когда функция вызывает саму себя, либо те функции, которые она вызывает вызывают обсуждаемую функцию.
Стек - место в памяти, где хранятся переменные текущей функции. При рекурсии возможно переполнение стека, т.к. слишком глубокая рекурсия не даёт стеку возможность опустошаться, а опустошается он лишь при завершении функции. Однако эта хрень возможна лишь при очень навороченных деревьях - у меня даже в реестре ни разу её не было, поэтому забей.
Что такое "RD" я сам не знаю. Берусь предположить, что это RemoveDirectory, хотя может это какая-нить RealDelete про которую я не знаю.
Ремарка: эти определения не претендуют на абсолютную правильность. Это лишь то, как я понимаю эти вещи, почитав обрывками книги...
Ремарка №2: первую ремарку написал, чтобы мне тут же не сказали "Ламо, да это же ....", хотя всё ещё впереди.
Один из вариантов такой рекурсии чуть ниже. Можно ещё сделать через FieSystemObject, но мне так не нравится, поэтому даю этот код.
Option Explicit
Private Declare Function FindFirstFile Lib "kernel32.dll" Alias "FindFirstFileA" (ByVal lpFileName As String, ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32.dll" Alias "FindNextFileA" (ByVal hFindFile As Long, ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32.dll" (ByVal hFindFile As Long) As Long
Private Const MAX_PATH As Long = 260
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
Public Sub RecEnumFiles(strDir As String, strMask As String)
Dim fHandle As Long, fData As WIN32_FIND_DATA
Dim tmpStr As String
With fData
fHandle = FindFirstFile(strDir + "\*", fData)
If fHandle > 0 Then
Do
If InStr(1, .cFileName, "." + vbNullChar) = 0 Then
tmpStr = Left$(.cFileName, InStr(1, .cFileName, vbNullChar) - 1)
If .dwFileAttributes And vbDirectory Then
If InStr(1, strDir, "\\" > 0 Then
strDir = Replace$(strDir, "\\", "\"
End If
RecEnumFiles strDir + "\" + tmpStr, strMask
End If
End If
Loop While FindNextFile(fHandle, fData) = 1
FindClose fHandle
End If
fHandle = FindFirstFile(strDir + "\" + strMask, fData)
If fHandle > 0 Then
Do
If Not CBool((.dwFileAttributes And vbDirectory)) Then
tmpStr = Left$(.cFileName, InStr(1, .cFileName, vbNullChar) - 1)
Debug.Print tmpStr
'Form1.Text1 = Form1.Text1 + vbCrLf + tmpStr
End If
Loop While FindNextFile(fHandle, fData) = 1
FindClose fHandle
End If
End With
End Sub
Удаление файлов воткни там, где печать, а удаление папки сразу после рекурсивного вызова. Тока лучше юзай апишки
Private Declare Function RemoveDirectory Lib "kernel32.dll" Alias "RemoveDirectoryA" (ByVal lpPathName As String) As Long
Private Declare Function DeleteFile Lib "kernel32.dll" Alias "eleteFileA" (ByVal lpFileName As String) As Long
а то начнутся траблы, типа не смог удалить файлы и вылетел...
Кстати, если тебе надо удалить лишь одну папку, в которой нет вложенных (а вдруг?!), то могу предложить этот код, которым меня просветил Александр:
Private Function EnumFilesIn(strDir As String, strMask As String) As Long
Dim strItem As String, strToFind As String, lngNum As Long
strToFind = strDir + "\" + strMask
strItem = Dir$(strToFind)
Do While Len(strItem) > 0
lngNum = lngNum + 1
Debug.Print strItem
'Text1.Text = Text1.Text + vbCrLf + strItem
strItem = Dir$()
Loop
EnumFilesIn = lngNum
End Function
вызов функций для всех файлов типа такого
EnumFilesIn "i:\","*.*"
Вроде всё.