Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Возвратить Случайную папку


Автор: DenageS 18.10.2006, 17:51
Помогите как можно возвратить случайную папку (существующую) на любом из дисков компа.

Автор: Akina 18.10.2006, 18:14
Получить список всех папок (как обычно, рекурсивным поиском). Подсчитать количество. Сгенерить случайное число в полученном диапазоне целых. Выдать соотв. папку из списка.

Автор: JUmPER 19.10.2006, 08:20
а зачем это, если не секрет?
место локации трояна?

Автор: DenageS 19.10.2006, 17:50
Цитата(Akina @ 18.10.2006,  18:14)
Получить список всех папок (как обычно, рекурсивным поиском). Подсчитать количество. Сгенерить случайное число в полученном диапазоне целых. Выдать соотв. папку из списка.

Можно пожалуйста поподробнее. "рекурсивным поиском"? Объясни.
До троянов мне далеко!

Автор: JUmPER 19.10.2006, 18:40
получаем список дисков
для каждого диска:
   получаем список папок в корне
   для каждой папки из списка:
      получаем список папок в ней...
и т.д.

все папки в массив (например) и выбираем из него случайный элемент -- вот и случайная папка

PS: избегаем ссылок на верхние уровни (во избежание зацикливания)

Автор: DenageS 20.10.2006, 17:06
А сами команды не найдутся? smile 

Автор: JUmPER 23.10.2006, 09:32
держи код класса, который делает то, что тебе нужно
Код

' ==============================================
' Class CFolderProcessor
' codded by JUmPER
' ==============================================
Option Explicit

Private fso As New FileSystemObject
Private folders() As String
'

' конструктор класса
Public Sub init(Optional aRootPath As String = "")
    If (aRootPath = "") Then ' добавление всех папок со всех дисков (по умолчанию)
        Dim oDrives As Drives
        Dim cur_drive As Drive

        Set oDrives = fso.Drives
        For Each cur_drive In oDrives
            Call merge(folders, GetFolders(cur_drive.Path & "\"))
        Next
    Else ' добавление папок только внутри корневой
        folders = GetFolders(aRootPath)
    End If

    Randomize
End Sub

' случайная папка ;)
Public Function GetRandomFolder() As String
    Dim indx As Long

    indx = Round(rnd() * UBound(folders))

    GetRandomFolder = folders(indx)
End Function

' рекурсивная функция получения подпапок текущей папки (текущая тоже включается в результат)
Private Function GetFolders(aFolderPath As String) As String()
    Dim oFolder As folder
    Dim oFolders As folders
    Dim result() As String
    Dim cur_folder As folder
    Dim i As Long

    ' получение подпапок
    On Error GoTo L_ACCESS_DENIED
    Set oFolder = fso.GetFolder(aFolderPath)
    Set oFolders = oFolder.SubFolders
    ReDim result(oFolders.Count)
    On Error GoTo 0

    ' добавление текущих поддиректорий
    result(0) = aFolderPath
    i = 1
    For Each cur_folder In oFolders
        result(i) = cur_folder.Path
        i = i + 1
    Next

    ' рекурсивное добавление детей детей и т.д.
    For Each cur_folder In oFolders
        Call merge(result, GetFolders(cur_folder.Path))
    Next

    GetFolders = result

    Exit Function
L_ACCESS_DENIED: ' доступ к директории закрыт.
    Dim res() As String ' возвращаем пустой массив
    GetFolders = res
End Function

' добавление второго массива в первый
Private Sub merge(ByRef arr1, ByRef arr2)
    Dim i As Long
    Dim arr1_len As Long
    Dim arr2_len As Long

    If (isEmptyArray(arr2)) Then
        Exit Sub
    End If

    If (isEmptyArray(arr1)) Then
        arr1 = arr2
        Exit Sub
    Else
        arr1_len = UBound(arr1) + 1
    End If

    arr2_len = UBound(arr2) + 1

    ReDim Preserve arr1(arr1_len + arr2_len - 1)
    For i = 0 To arr2_len - 1
        If (IsObject(arr2(i))) Then
            Set arr1(i + arr1_len) = arr2(i)
        Else
            arr1(i + arr1_len) = arr2(i)
        End If
    Next
End Sub

' проверка массива на пустоту (во избежание исключительной ситуации при обращении к пустому массиву)
Private Function isEmptyArray(ByRef aArr) As Boolean
    On Error GoTo invalid

    Dim a As Integer
    a = UBound(aArr)
    isEmptyArray = (a < 0)
    Exit Function

invalid:
    isEmptyArray = True
End Function

пример использования:
Код

Private rnd As New CFolderProcessor

Private Sub Form_Click()
    Call MsgBox(rnd.GetRandomFolder)
End Sub

Private Sub Form_Load()
    Call rnd.init
End Sub


не забудь добавить к проекту Microsoft Scripting Runtime

Автор: DenageS 23.10.2006, 10:42
JUmPER, я вставляю этот код в модуль. На CFolderProcessor ругается "пределяемый пользователем тип не определен".
При попытке вызова msgbox GetRandomFolder, "нижний идекс вне диапазона" 
Я наверное что-то делаю не так? smile 

Автор: JUmPER 23.10.2006, 10:54
создаёшь в проекте новый класс с именем CFolderProcessor smile 
и добавляешь в него код

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)