Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Как можно сохранить дерево каталогов? Добавлено: 18.12.05 04:34  

Автор вопроса:  SerJ
У меня есть огромный код :-(

'...АПИ декларации
Public Function StartFind(ByVal sFilter As String, ByRef FindArray() As WIN32_FIND_DATA)
    Dim lngHandle As Long                                   'Хендл открытого файла
    Dim TempData As WIN32_FIND_DATA                         'Временная переменная
    lngHandle = FindFirstFile(sFilter & Chr(0), TempData)   'Находим хендл
    If lngHandle = INVALID_HANDLE_VALUE Then Exit Function  'Если ничего нет, уходим
    ReDim FindArray(0)                                      'Ресайзим массив под 1-й файл (директорию)
    FindArray(0) = TempData                                 'Присваеваем информацию о файле
    Do Until FindNextFile(lngHandle, TempData) = 0          'Продолжаем поиск, пока не ошибемся
        DoEvents                                            'Не зависаем
        ReDim Preserve FindArray(UBound(FindArray) + 1)     'Ресайзим массив на 1 больше прежнего
        FindArray(UBound(FindArray)) = TempData             'Присвоение очередной порции информации
    Loop
    Call FindClose(lngHandle)                               'Закрываем хендл, не глючим
End Function

'Поиск файлов по маске в подкаталогах
Public Sub ScanForFiles(StartPath As String, Pattern As String, Files() As String)
    Dim i As Long, Dir1() As String, File1() As String, file As Long
    file = UboundS(Files())
    file = file + 1
    If Mid(StartPath, Len(StartPath), 1) = "\" Then
    Else
        StartPath = StartPath + "\"
    End If
    DirBoxEmu StartPath, Dir1()
    FileBoxEmu StartPath, Pattern, File1()
    For i = 0 To UboundS(File1())
        DoEvents
        ReDim Preserve Files(i + file)
        Files(i + file) = StartPath + File1(i)
    Next
    For i = 0 To UboundS(Dir1())
        DoEvents
        ScanForFiles StartPath + Dir1(i), Pattern, Files()
    Next
End Sub

'Эмуляция DirBox
Private Sub DirBoxEmu(path As String, Dirs() As String)
    Dim Data() As WIN32_FIND_DATA, i As Long, Counter As Long, TempName As String
    Counter = -1
    Erase Dirs()
    If Mid(path, Len(path), 1) = "\" Then
    Else
        path = path + "\"
    End If
    Erase Data()
    StartFind path + "*", Data()
    For i = 0 To UboundFind(Data())
        DoEvents
        TempName = Left(Data(i).cFileName, InStr(1, Data(i).cFileName, Chr(0)) - 1)
        If TempName <> "." And TempName <> ".." Then
            If GetEntryType(Data(i).dwFileAttributes) = 1 Then
                Counter = Counter + 1
                ReDim Preserve Dirs(Counter)
                Dirs(Counter) = TempName
                Debug.Print Time & ">Found Folder " & Dirs(Counter)
            End If
        End If
    Next
End Sub

'Эмуляция FileBox
Private Sub FileBoxEmu(path As String, Filter As String, Files() As String)
    Dim Data() As WIN32_FIND_DATA, Repeat As Long, i As Long, j As Long, Counter As Long, Filters() As String, TempName As String
    Counter = -1
    Erase Files()
    Erase Filters()
    If Mid(path, Len(path), 1) = "\" Then
    Else
        path = path + "\"
    End If
    Filters() = Split(Filter, ";")
    Counter = UboundS(Filters())
    If Counter = -1 Then
        Repeat = 0
        ReDim Filters(0)
        Filters(0) = "*"
    Else
        Repeat = Counter
    End If
    Counter = -1
    For j = 0 To Repeat
        DoEvents
        Erase Data()
        StartFind path + Filters(j), Data()
        For i = 0 To UboundFind(Data())
            DoEvents
            TempName = Left(Data(i).cFileName, InStr(1, Data(i).cFileName, Chr(0)) - 1)
            If TempName <> "." And TempName <> ".." Then
                If GetEntryType(Data(i).dwFileAttributes) = 0 Then
                    Counter = Counter + 1
                    ReDim Preserve Files(Counter)
                    Files(Counter) = TempName
                    Debug.Print Time & ">Found File " & Files(Counter)
                End If
            End If
        Next
    Next
End Sub

Private Function GetEntryType(dwAttributes As Long) As Long
    GetEntryType = 0 'файл по умолчания
    If (dwAttributes And &H10) = &H10 Then
        GetEntryType = 1 ' каталог
    Else
        GetEntryType = 0 'файл
    End If
End Function

'Странности в работи функции UBound() вынудили написать свои
Public Function UboundFind(Data() As WIN32_FIND_DATA) As Long
    On Error GoTo Handler:
    UboundFind = UBound(Data())
    Exit Function
Handler:
    UboundFind = -1
End Function

Public Function UboundS(Data() As String) As Long
    On Error GoTo Handler:
    UboundS = UBound(Data())
    Exit Function
Handler:
    UboundS = -1
End Function

Вопрос: как можно оптимизировать код, а главное - сохранить структуру созданного дерева каталогов в какой-нить файл, открыв который можно было увидеть типа следующее:
C:\
|-Apps
| |-picture.bmp
| |-file2.doc
| |-BigBox
| | |-stuff.inf
| |-lol.ico
|-VBNET
| |-joker.xls
|-SQL
|-pagefile.sys
......и т.д.
ЗЫ. Извините за износ ваших скроллов. Заранее благодарен.

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 SerJ



Вопросов: 24
Ответов: 332
 Профиль | | #1 Добавлено: 18.12.05 04:38
ЗЗЫ. Не обязательно применять символ | , можно чё-то другое....

Ответить

Номер ответа: 2
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #2 Добавлено: 18.12.05 05:50
На счет сохранения в файл, можно так:

    Dim aUnit() As String
    For i = 1 To TreeView.Nodes.Count
        aUnit = Split(TreeView.Nodes.Item.FullPath, "\";)
        Print #fNum, String(UBound(aUnit), "|";) & TreeView.Nodes.Item.Text
    Next

Ответить

Номер ответа: 3
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #3 Добавлено: 18.12.05 05:53
Нужно TreeView.Nodes.Item(i), а не TreeView.Nodes.Item

Ответить

Номер ответа: 4
Автор ответа:
 SerJ



Вопросов: 24
Ответов: 332
 Профиль | | #4 Добавлено: 18.12.05 06:15
Хмм... А как в ТриВью отысканные имена файлов?

Ответить

Номер ответа: 5
Автор ответа:
 SerJ



Вопросов: 24
Ответов: 332
 Профиль | | #5 Добавлено: 18.12.05 06:16
ТриВью=TreeView
Sorry..

Ответить

Номер ответа: 6
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #6
Добавлено: 18.12.05 15:24
Передавай еще одним аргументом для ScanForFiles аргумент deep, увеличивай его при вызове, в выводе пиши перед именем deep знаков |

Ответить

Номер ответа: 7
Автор ответа:
 SerJ



Вопросов: 24
Ответов: 332
 Профиль | | #7 Добавлено: 19.12.05 00:11
А где энто у меня там deep? Энтот код мне вообще надоело дибаггать. У меня раньше был код попроще, но где-то я его затерял :-(
Кто занает как реализовать поиск файлов средствами АПИ в более безболезненной (простой) форме?

Ответить

Номер ответа: 8
Автор ответа:
 SerJ



Вопросов: 24
Ответов: 332
 Профиль | | #8 Добавлено: 19.12.05 00:11
А где энто у меня там deep? Энтот код мне вообще надоело дибаггать. У меня раньше был код попроще, но где-то я его затерял :-(
Кто знает как реализовать поиск файлов средствами АПИ в более безболезненной (простой) форме?

Ответить

Номер ответа: 9
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #9
Добавлено: 19.12.05 02:38
Учимся читать на вбнет.ру: я тебе посоветовал его добавить. Способа проще Find[First|Next]File представить трудно

Ответить

Номер ответа: 10
Автор ответа:
 SerJ



Вопросов: 24
Ответов: 332
 Профиль | | #10 Добавлено: 19.12.05 11:41
Учимся читать на вбнет.ру: я тебе посоветовал его добавить.

:-) А у меня разве Find[First|Next]File не реализован?
Способа проще Find[First|Next]File представить трудно

Да я знаю, что энто самый простой способ (на АПИ). Но тут приведён большой код. Мне необходимо следующее:
1. Сделать его меньше, понятнее, доступнее.
2. Сохранить инфу про иерархическое состояние папок и файлов на компе

Ответить

Номер ответа: 11
Автор ответа:
 SerJ



Вопросов: 24
Ответов: 332
 Профиль | | #11 Добавлено: 19.12.05 11:50
Учимся читать на вбнет.ру: я тебе посоветовал его добавить

Или ты имел ввиду
Public Sub ScanForFiles(StartPath As String, Pattern As String, Files() As String[B],Deep as String[/B];)
....

Ответить

Номер ответа: 12
Автор ответа:
 Pashenko



ICQ: 176176951 

Вопросов: 14
Ответов: 655
 Профиль | | #12 Добавлено: 19.12.05 15:53
Shell "cmd /c tree c:\ /f >c:\tree.txt", vbHide

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам