Как перебрать все подкаталоги

Тема в разделе "Lotus - Программирование", создана пользователем PavelT100, 15 авг 2008.

  1. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Код (Text):
        Dim fileNameArray As String
    fileNameArray = Dir$("C:\TEMP\", 0)
    Do While fileNameArray <> ""
    Print fileNameArray
    fileNameArray = Dir$()
    Loop   
    Exit Function
    Вот так перебираются файлы в каталоге C:\TEMP. Но:

    Код (Text):
        Dim fileNameArray As String
    fileNameArray = Dir$("C:\TEMP\", 16)
    Do While fileNameArray <> ""
    Print fileNameArray
    fileNameArray = Dir$()
    Loop   
    Exit Function
    к моему удивлению перебираются таким образом не только подкаталоги, но и файлы. А как мне выделить только подкаталоги ?
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    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
     
  3. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Вот именно так я и сделал, и поставил вторым параметром 16, а мне вернули и каталоги и файлы.
     
  4. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Хелп говорит:
    Т.е. этот параметр указывает что еще добавить к списку файлов. В твоём случае к списку файлов добавляется список папок.
    Решение очевидно. Получить пересечение 2х списков(с папками и без).
     
  5. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Эх, в моем случае я даже могу просто удалять файлы, а потом заняться обработкой подкаталогов, но я думал можно как то проще это сделать, без поиска пересечений.
     
  6. Кирилл Шваб

    Кирилл Шваб Well-Known Member

    Регистрация:
    30 июн 2006
    Сообщения:
    144
    Симпатии:
    4
    Если работаешь под Windows, то можешь использовать FileSystemObject.

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

    Код (Text):
    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 проверять директория ли это.

    Код (Text):
    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
    Только когда проходишь по директориям не забывай пропускать "." и "..".
     
  7. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    ну правильно,...

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

    НО! ведб можно определить атрибуты самого файла
    GetFileAttr
    Пример их хэлпа
    Код (Text):
    %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$
     
  8. Кирилл Шваб

    Кирилл Шваб Well-Known Member

    Регистрация:
    30 июн 2006
    Сообщения:
    144
    Симпатии:
    4
    Эх, знал бы про GetFileAttr раньше, не заморачивался бы с WinAPI. А то как-то раз столько времени на это дело потратил... ;-)
     
Загрузка...

Поделиться этой страницей