Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как перебрать все подкаталоги
Форум программистов > Базы данных и администрирование > Lotus > Lotus - Программирование
PavelT100
    Dim fileNameArray As String
    fileNameArray = Dir$("C:\TEMP\", 0)
    Do While fileNameArray <> ""
        Print fileNameArray
        fileNameArray  = Dir$()
    Loop    
    Exit Function

Вот так перебираются файлы в каталоге C:\TEMP. Но:

    Dim fileNameArray As String
    fileNameArray = Dir$("C:\TEMP\", 16)
    Do While fileNameArray <> ""
        Print fileNameArray
        fileNameArray  = Dir$()
    Loop    
    Exit Function

к моему удивлению перебираются таким образом не только подкаталоги, но и файлы. А как мне выделить только подкаталоги ?
Morpheus
PavelT100
втарой параметр в Dir

Dir[$] [ ( fileSpec [ , attributeMask ] ) ]

Mask File attribute Constant
0 Normal file ATTR_NORMAL
2 Hidden file ATTR_HIDDEN
4 System file ATTR_SYSTEM
8 Volume label ATTR_VOLUME. If any other attribute is specified, ATTR_VOLUME is ignored.
16 Directory ATTR_DIRECTORY
PavelT100
Цитата(Morpheus @ 15:08:2008 - 15:10) *
16 Directory ATTR_DIRECTORY

Вот именно так я и сделал, и поставил вторым параметром 16, а мне вернули и каталоги и файлы.
Medevic
Хелп говорит:
Цитата
Dir$ always returns the names of normal files. To include other files in the returned list of file names, specify the sum of those values in the following table that correspond to the desired kinds of files:

Т.е. этот параметр указывает что еще добавить к списку файлов. В твоём случае к списку файлов добавляется список папок.
Решение очевидно. Получить пересечение 2х списков(с папками и без).
PavelT100
Цитата(Medevic @ 15:08:2008 - 15:28) *
Решение очевидно. Получить пересечение 2х списков(с папками и без).

Эх, в моем случае я даже могу просто удалять файлы, а потом заняться обработкой подкаталогов, но я думал можно как то проще это сделать, без поиска пересечений.
Кирилл Шваб
Если работаешь под Windows, то можешь использовать FileSystemObject.

Пример с рекурсией (перебирающий все поддиректории в заданной):

Sub Initialize
    
    Dim objFSO As Variant
    Dim objRootFolder As Variant
    Dim rootFolder As String
    
    rootFolder = "C:\Test"
    
    Set objFSO = CreateObject( "Scripting.FileSystemObject" )
    Set objRootFolder = objFSO.GetFolder( rootFolder )
    Call GetDir_Recurse( objRootFolder  )
    
End Sub

Sub GetDir_Recurse( SrcFolder )
    
    Dim arrSubfolders As Variant
    Set arrSubfolders = SrcFolder.SubFolders
    Forall currentFolder In arrSubfolders
        Print currentFolder.Name
        Call GetDir_Recurse( currentFolder )
    End Forall
    
End Sub

Если надо перебирать только поддиректории 1-го уровня, то убираешь рекурсию и все.


Как вариант еще можно и с помощью Dir проходить по директории и с помощью WinAPI проверять директория ли это.

Const FILE_ATTRIBUTE_DIRECTORY = 16
Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (Byval  lpFileName As String) As Long

Sub Initialize
    
    Dim fileNameArray As String
    Dim rootFolder As String
    
    rootFolder = "C:\Test\"
    fileNameArray = Dir$( rootFolder, 16 )
    
    Do While fileNameArray <> ""
        If IsDir( rootFolder & fileNameArray ) Then Print fileNameArray
        fileNameArray  = Dir$()
    Loop
End Sub

Function IsDir( srcFolder )
    
    IsDir = False
    If GetFileAttributes( srcFolder ) = FILE_ATTRIBUTE_DIRECTORY Then IsDir = True
    
End Function

Только когда проходишь по директориям не забывай пропускать "." и "..".
Morpheus
Цитата(PavelT100 @ 15:08:2008 - 15:16) *
Вот именно так я и сделал, и поставил вторым параметром 16, а мне вернули и каталоги и файлы.

ну правильно,...

Medevic правильно сослался на хэлп, так и есть. атрибут ДОБАВЛЯЕТ к нормальным файлам и другие элементы

НО! ведб можно определить атрибуты самого файла
GetFileAttr
Пример их хэлпа
Цитата
This example creates a file, calls SetFileAttr to set its attributes to Read-Only, System, and Hidden, and then calls GetFileAttr to determine the file attributes.

%Include "lsconst.lss"
Dim fileNum As Integer, attr As Integer
Dim fileName As String, msg As String
fileNum% = FreeFile()
fileName$ = "data.txt"
Open fileName$ For Output As fileNum%
Close fileNum%
SetFileAttr fileName$, ATTR_READONLY + ATTR_SYSTEM + _ ATTR_HIDDEN
attr% = GetFileAttr(fileName$)
If (attr% And ATTR_READONLY) Then
  msg$ = msg$ & " Read-Only "
Else
  msg$ = msg$ & " Normal "
End If
If (attr% And ATTR_HIDDEN)    Then msg$ = msg$ & " Hidden "
If (attr% And ATTR_SYSTEM)    Then msg$ = msg$ & " System "
If (attr% And ATTR_DIRECTORY) Then msg$ = msg$ & " Directory "
Print msg$
SetFileAttr fileName$, ATTR_NORMAL  ' Reset to normal.
Kill fileName$
Кирилл Шваб
Эх, знал бы про GetFileAttr раньше, не заморачивался бы с WinAPI. А то как-то раз столько времени на это дело потратил... ;-)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.