Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 | 2 |

 

  Вопрос: Рекурсивный обход папок (оптимизация) Добавлено: 17.02.05 07:54  

Автор вопроса:  ZagZag | ICQ: 295002202 
Есть много способов составить список всех файлов в папке и ее подпапках.
Каой более быстрый?
Дело в том что антивирус при обходе папок очень сильно напрягается (FSO,
FindFirstFile)
Есть ли способ просто получить этот список файлов, а не открывать каждый из
них? Если можно дайте пример.

Ответить

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

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



Хранитель чата

ICQ: 137392264 

Вопросов: 8
Ответов: 557
 Web-сайт: www.hypertech.ru
 Профиль | | #1
Добавлено: 17.02.05 08:20
Можно получить список:
dir /A:D /S

Ответить

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #6
Добавлено: 17.02.05 12:30
А что, dir /s во вложенных папках тоже найдёт?

2cresta: dir /?. Найдет

Не понял, можно примерчик?
Положись на мое честное слово :)

Ответить

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



Вопросов: 117
Ответов: 1538
 Профиль | | #7 Добавлено: 17.02.05 12:49
Не-а :) Показывай рекурсию или что там ещё. А то не верю :)

Ответить

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #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
Тээк! Тема без меня в сторону съехала :)
Поправлю....
dir /s

Явно не подходит

Option Explicit
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:
Можно открыть \\device\physicalvolume0/

Это вариант! Как это можно из VB организовать?
Дело в том что при поиске файлов WinRAR'ом Касперский тоже подвисает, но при
паузе или остановке поиска он сразу же успокаивается, а поиск VB'шной
программой напрягает его основательно :(

Стал вопрос: Как наискорейшим образом получить атрибуты файла

Ответить

Номер ответа: 15
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #15 Добавлено: 19.02.05 09:13
Самый лучший вариант - uninstall касперского. Если он настолько туп, что GetFileAttributes принимает за признак вредоносной программы - мочить его.

А вообще самый быстрый способ - без GetFileAttributes. Видимо ты невнимательно смотрел, что из себя представляет структура WIN32_FIND_DATA
Подсказка:
.if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

Ответить

Страница: 1 | 2 |

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



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