Страница: 1 | 2 |
Вопрос: Рекурсивный обход папок (оптимизация)
Добавлено: 17.02.05 07:54
Автор вопроса: ZagZag | ICQ: 295002202
Есть много способов составить список всех файлов в папке и ее подпапках.
Каой более быстрый?
Дело в том что антивирус при обходе папок очень сильно напрягается (FSO,
FindFirstFile)
Есть ли способ просто получить этот список файлов, а не открывать каждый из
них? Если можно дайте пример.
Ответы
Всего ответов: 17
Номер ответа: 1
Автор ответа:
boevik
Хранитель чата
ICQ: 137392264
Вопросов: 8
Ответов: 557
Web-сайт:
Профиль | | #1
Добавлено: 17.02.05 08:20
Можно получить список:
dir /A:D /S
Номер ответа: 2
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #2
Добавлено: 17.02.05 08:39
dir /s
Номер ответа: 3
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #3
Добавлено: 17.02.05 11:31
А что, dir /s во вложенных папках тоже найдёт?
Самый быстрый способ - FindFirstFile
К тому же FindFirstFile не открывает файлы. Только ищет. Открывает CreateFile.
Если на VB, то выбор невелик, либо напрягаться, либо медленно. Быстро и без напряга на VB не получится.
Чтобы быстро - нужно на чем-то другом делать, не на VB. Чтобы не напрягало основной поток - поиск нужно в отдельном потоке делать. Опять же не на VB.
Номер ответа: 4
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 17.02.05 11:56
2cresta: dir /?. Найдет.
Номер ответа: 5
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #5
Добавлено: 17.02.05 12:08
Не понял, можно примерчик?
Номер ответа: 6
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #6
Добавлено: 17.02.05 12:30
Номер ответа: 7
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #7
Добавлено: 17.02.05 12:49
Не-а Показывай рекурсию или что там ещё. А то не верю
Номер ответа: 8
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #8
Добавлено: 17.02.05 13:04
Нажми кнопку Пуск, выбери "Выполнить", напечатай cmd, нажми Энтер, введи "dir /s" и увидишь рекурсию.
Номер ответа: 9
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #9
Добавлено: 17.02.05 13:22
Ха-ха, этот способ предложи автору вопроса ))
К тому же какая может быть скорость у этого способа? При том, что все попутно выводится в окно (сколько времени надо на это). И как воспользоваться результатом??? Сохранить в файл??? Затем открыть файл и загрузить его???
Номер ответа: 10
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #10
Добавлено: 17.02.05 16:05
cresta, ты меня удивляешь. Что такое пайпы, знаешь? Тогда зачем файл?
Номер ответа: 11
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #11
Добавлено: 17.02.05 18:17
Не-а, не знаю ))
Вызывай хоть cmd, хоть чёрта в ступе, но в любом случае мимо FindFirstFile или его native-аналога не пройдешь, так ведь? Ну и чем больше обёрток, тем больше тормозов.
Номер ответа: 12
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #12
Добавлено: 17.02.05 19:31
Ну почему же Можно открыть \\device\physicalvolume0 и прочитать все, что тебе надо, непосредственно из MFT
Номер ответа: 13
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #13
Добавлено: 17.02.05 19:45
Ну дык, я полагаю, что если вместо винды написать своё что-то то можно в "этом что-те" ещё быстрее найти.
Ну эт ладно, пока мы тут общаемся - уже и вечереет, а где собственно ZagZag со своим кодом, который необходимо оптимизировать? Или он как Сусанин, запустил нас по кругу и мы тут друг другу лапшу вешаем
Номер ответа: 14
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #14
Добавлено: 19.02.05 01:54
Тээк! Тема без меня в сторону съехала
Поправлю....
Явно не подходит
Private Const MAX_PATH = 260
Private Const INVALID_HANDLE_VALUE = -1
Private Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA"
(ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA"
(ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long)
As Long
Private Declare Function GetFileAttributes Lib "kernel32.dll" Alias
"GetFileAttributesA" (ByVal lpFileName As String) As Long
Private Sub InterateObject(Source As String)
'On Error Resume Next
Dim objName As String
Dim hSearch As Long
Dim WFD As WIN32_FIND_DATA
Dim Cont As Integer
Cont = True
hSearch = FindFirstFile(Source & "*", WFD)
If hSearch <> INVALID_HANDLE_VALUE Then
Do While Cont
objName = Left(WFD.cFileName, InStr(WFD.cFileName, Chr(0)) - 1)
If objName <> "." And objName <> ".." Then
If GetFileAttributes(Source & objName) =
FILE_ATTRIBUTE_DIRECTORY Then 'Ведь без этого она не сможет отличить
файл от папки?
InterateObject Source & objName & "\"
Else
List1.AddItem Source & objName
End If
End If
Cont = FindNextFile(hSearch, WFD)
Loop
Cont = FindClose(hSearch)
End If
End Sub
Private Sub Command1_Click()
InterateObject "C:\"
End Sub
Еод собствено банален - работает очень быстро... и все бы ничего, но
Касперский оказывается недоволен ф-цией GetFileAttributes и каждый
файлик проверить пытается
Как иначе можно получить атрибуты файла? Чтобы файл не открывать?!
Sharp:
Это вариант! Как это можно из VB организовать?
Дело в том что при поиске файлов WinRAR'ом Касперский тоже подвисает, но при
паузе или остановке поиска он сразу же успокаивается, а поиск VB'шной
программой напрягает его основательно
Стал вопрос: Как наискорейшим образом получить атрибуты файла
Номер ответа: 15
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #15
Добавлено: 19.02.05 09:13
Самый лучший вариант - uninstall касперского. Если он настолько туп, что GetFileAttributes принимает за признак вредоносной программы - мочить его.
А вообще самый быстрый способ - без GetFileAttributes. Видимо ты невнимательно смотрел, что из себя представляет структура WIN32_FIND_DATA
Подсказка: