Страница: 1 |
Страница: 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
На счет сохранения в файл, можно так:
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-сайт:
Профиль | | #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-сайт:
Профиль | | #9
Добавлено: 19.12.05 02:38
Учимся читать на вбнет.ру: я тебе посоветовал его добавить. Способа проще Find[First|Next]File представить трудно
Номер ответа: 10
Автор ответа:
SerJ
Вопросов: 24
Ответов: 332
Профиль | | #10
Добавлено: 19.12.05 11:41
А у меня разве Find[First|Next]File не реализован?
Да я знаю, что энто самый простой способ (на АПИ). Но тут приведён большой код. Мне необходимо следующее:
1. Сделать его меньше, понятнее, доступнее.
2. Сохранить инфу про иерархическое состояние папок и файлов на компе
Номер ответа: 11
Автор ответа:
SerJ
Вопросов: 24
Ответов: 332
Профиль | | #11
Добавлено: 19.12.05 11:50
Или ты имел ввиду
....
Номер ответа: 12
Автор ответа:
Pashenko
ICQ: 176176951
Вопросов: 14
Ответов: 655
Профиль | | #12
Добавлено: 19.12.05 15:53