Вопрос на засыпку

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Pavlo
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 06.12.2003 (Сб) 14:12

Вопрос на засыпку

Сообщение Pavlo » 21.03.2004 (Вс) 15:26

Мне нужно что бы моя прога облазила по диску например с:\ т.е попала в каждую папку. Предложыте алгоритм, или возможно кто то такое уже делал тогда дайте код. Я пытался через массиви но короче запутался. Help me please!!!!!!!!!!!! :shock:

areh
Постоялец
Постоялец
 
Сообщения: 530
Зарегистрирован: 02.12.2002 (Пн) 12:28
Откуда: РОССИЯ, Салехард

Сообщение areh » 21.03.2004 (Вс) 16:15

Алгоритм должен быть примерно такой:

во-первых, это должна быть процедура (функция), котороая в качестве параметра получает путь к папке
во-вторых, делаешь в данной папке что тебе надо сделать со всеми папками (например создать файл в каждой папке :-)
в третьих получаешь список вложенных папок и запускаешь цикл, в теле которого вызываешь процедуру (эту же самую, т.е. у тебя рекурсия получаеться) и передаешь параметром вложенную папку (т.е. цикл должен вызвать саму процедуру для всех вложенных папок)

ну вот, а в теле основной программы вызываешь эту процедуру с параметром "C:\" и таким образом все папки на диске C будут перебераться...

вродебы всё..

Pavlo
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 06.12.2003 (Сб) 14:12

Сообщение Pavlo » 21.03.2004 (Вс) 16:39

А как получить список вложених папок? Я ещо не слишком опытный может ти помжеш мне зделать ету прогу?

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 21.03.2004 (Вс) 16:54

Рекурсия вам в помощь!

Код: Выделить всё
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 GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Dim iDir As String
Const MAX_PATH = 260
Const MAXDWORD = &HFFFF
Const INVALID_HANDLE_VALUE = -1
Const FILE_ATTRIBUTE_ARCHIVE = &H20
Const FILE_ATTRIBUTE_DIRECTORY = &H10
Const FILE_ATTRIBUTE_HIDDEN = &H2
Const FILE_ATTRIBUTE_NORMAL = &H80
Const FILE_ATTRIBUTE_READONLY = &H1
Const FILE_ATTRIBUTE_SYSTEM = &H4
Const FILE_ATTRIBUTE_TEMPORARY = &H100

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 Function StripNulls(OriginalStr As String) As String
    If (InStr(OriginalStr, Chr(0)) > 0) Then
        OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
    End If
    StripNulls = OriginalStr
End Function

Private Function FindFilesAPI2(path As String, SearchStr As String, FileCount As Integer, DirCount As Integer, sFound() As String, Optional oldpath As String)
On Error Resume Next
    'KPD-Team 1999
    'Улучшения (c) hCORe 2004
    'E-Mail: KPDTeam@Allapi.net
    '           vb6@mail.ru
    'URL: http://www.allapi.net/
    '        http://amelso.narod.ru
   
    Dim FileName As String ' Переменная для имени...
    Dim DirName As String ' Папка
    Dim dirNames() As String ' Буфер папок
    Dim nDir As Integer ' количество директорий
    Dim i As Integer ' счетчик цикла...
    Dim hSearch As Long ' дескриптор поиска
    Dim WFD As WIN32_FIND_DATA
    Dim Cont As Integer
    If Right(path, 1) <> "\" Then path = path & "\"
    ' Поиск подпапок.
    nDir = 0
    ReDim dirNames(nDir)
    Cont = True
    ' Пройти по всем папкам и
    ' просуммировать размеры файлов.
    hSearch = FindFirstFile(path & SearchStr, WFD)
    Cont = True
    ReDim sFound(0) as String
    If hSearch <> INVALID_HANDLE_VALUE Then
        While Cont
        DoEvents
            FileName = StripNulls(WFD.cFileName)
            If (FileName <> ".") And (FileName <> "..") Then
                FindFilesAPI2 = FindFilesAPI2 + (WFD.nFileSizeHigh _
                * MAXDWORD) + WFD.nFileSizeLow
                FileCount = FileCount + 1
                If Len(FileName) <> 0 Then
                    Err.Clear
                    ChDir path & FileName
                    If Err = 0 Then
                        ReDim Preserve _
                        sFound(UBound(sFound) _
                        + 1)
                        sFound(UBound(sFound) - _
                        1) = path & FileName
                        Err.Clear
                    End If
                End If
            End If
            ' Получить дескриптор следующего файла
            Cont = FindNextFile(hSearch, WFD)
        Wend
    End If
    Cont = FindClose(hSearch)
    hSearch = FindFirstFile(path & "*", WFD)
    If hSearch <> INVALID_HANDLE_VALUE Then
        Do While Cont
        DoEvents
        DirName = StripNulls(WFD.cFileName)
        ' Пропустить текущую и родительскую папку.
        If (DirName <> ".") And (DirName <> "..") Then
            ' Проверка на атрибуты.
            If GetFileAttributes(path & DirName) And _
            FILE_ATTRIBUTE_DIRECTORY Then
                ReDim Preserve _
                sFound(UBound(sFound) _
                + 1)
                If Len(oldpath) <> 0 Then
                    sFound(UBound(sFound) - _
                    1) = Mid(path & DirName, Len(oldpath))
                Else
                    sFound(UBound(sFound) - _
                    1) = Mid(path & DirName, Len(path))
                End If

                Debug.Print path & DirName               

                FindFilesAPI2 path & DirName, SearchStr, _
                FileCount, DirCount, sFound(), path
            End If
        End If
        'Перейти в следующую подпапку.
        Cont = FindNextFile(hSearch, WFD)
        Loop
        Cont = FindClose(hSearch)
    End If
End Function


Пример использования:
FindFilesAPI2 "C:\" ,"*.*", 0, 0, myArray()
Моду создают модоки, а распространяют модозвоны.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList