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

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

Наш партнер Genesis Hackspace
  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.920
    Симпатии:
    1
    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
    Сообщения:
    145
    Симпатии:
    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.920
    Симпатии:
    1
    ну правильно,...

    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$
     
    Shandrik нравится это.
  8. Кирилл Шваб

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

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

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    177
    Симпатии:
    0
    Добрый вечер.

    Подскажите пожалуйста, столкнулся со следующей дилеммой:
    Есть сетевая шара с файлами. Перебираю их через CreateObject({Scripting.FileSystemObject}). Нужно отсеять системные файлы...
    GetFileAttr, FileSystemObject.Attributes, да и GetFileAttributes(как в примере с kernel32) возвращают сумму констант, отвечающих за разные атрибуты. Т.е. в моем случае, у системного файла помимо признака System(4) стоит еще атрибут Archive(32). Как итог, запрашивая атрибуты всеми способами получаю цифру 36. Печаль в том, что все файлы в этой директории имеют архивный атрибут. Как в таком случае однозначно идентифицировать системный файл?
     
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.169
    Симпатии:
    306
    что есть системный файл? Это понятие устарело этак лет 15-20 назад
    --- Добавлено 14 фев 2017. Первое сообщение размещено 14 фев 2017 ---
    прочекать файлы на предмет их "нормальности" можно так https://docs.oracle.com/javase/tutorial/essential/io/walk.html
    https://docs.oracle.com/javase/tutorial/essential/io/fileAttr.html
     
    Eugen нравится это.
  11. Мыш

    Мыш Well-Known Member
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.032
    Симпатии:
    9
    Битовый AND, не?
    If (attrib AND 4) = 4 Then....
     
    Eugen нравится это.
  12. Eugen

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    177
    Симпатии:
    0
    thumbs.db
    --- Добавлено 15 фев 2017. Первое сообщение размещено 15 фев 2017 ---
    Вроде сработало, но не понимаю, как это работает.
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.169
    Симпатии:
    306
    битовая операция
    а не проще фильтровать имена?
     
  14. Eugen

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    177
    Симпатии:
    0
    Фильтровать имена? Хмм... то есть просто отсеивать этот thumbs.db? А если еще какой "огрызок" появится? Это же вроде винда его создает для хранения эскизов мультимедиа. Сейчас у меня там только pdf, потом могут быть еще txt, csv, а может и просто изображения появятся...
     
  15. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.169
    Симпатии:
    306
    дык и фильтровать - чтонадо
     
  16. Eugen

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    177
    Симпатии:
    0
    и каждый раз при добавлении нового типа файлов что-то "докручивать"?
     
  17. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.169
    Симпатии:
    306
    уже эта фраза содержит ответ ;)
    т.е. этот "раз" произойдет и сделать процедуру "расширения" скрипта не составит труда
    файл приложили (с нек. типом) на сохранение - добавим фильтр
    какие сложности?
     
  18. Eugen

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    177
    Симпатии:
    0
    Мне больше нравится идея отсеять ненужное) Пользователи туда ничего не выкладывают - все файлы выгружаются системой, т.е. туда уже ничего лишнего не попадет, кроме системных файлов.

    В любом случае, спасибо за помощь.
     
Загрузка...

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