Получить список файлов в папке

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

Получить список файлов в папке

Сообщение beat_swamp » 06.12.2005 (Вт) 11:30

хотелось бы с примером кода1
путь к папке - константа (допустим "C:\111\"
нужно получить список имен файлов в ней1

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.12.2005 (Вт) 11:32

1
Lasciate ogni speranza, voi ch'entrate.

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 06.12.2005 (Вт) 11:41

alibek :)
beat_swamp
Переделаешь сам? Это перебирает папки:
Код: Выделить всё
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
            If Right(FileName, 3) = ".md" Or Right(FileName, 3) = ".MD" Then
            If Right$(Path, 9) <> "NEW_STRU\" Then
                        ReDim Preserve _
                        MasBaz(UBound(MasBaz) _
                        + 1)
                        MasBaz(UBound(MasBaz) - 1) = Path '& FileName
'                        Err.Clear
                        DirCount = DirCount + 1
                        End If
                    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 Len(DirName) <> 0 Then
'            If Right(DirName, 3) = ".md" Or Right(DirName, 3) = ".MD" Then
'            If Right$(Path, 9) <> "NEW_STRU\" Then
'                ReDim Preserve _
'                sFound(UBound(sFound) _
'                + 1)
'                If Len(oldpath) <> 0 Then
'                    sFound(UBound(sFound) - _
'                    1) = Path
'                Else
'                    sFound(UBound(sFound) - _
'                    1) = Path
'                End If
'                End If
'                End If
'                End If
            ' Проверка на атрибуты.
            If GetFileAttributes(Path & DirName) And _
            FILE_ATTRIBUTE_DIRECTORY Then

                Form1.Caption = 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()
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

beat_swamp
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 05.10.2005 (Ср) 16:16

Сообщение beat_swamp » 06.12.2005 (Вт) 11:42

пипец1 +) щас буду разбираться1 +)
спасибо1

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 06.12.2005 (Вт) 13:35

А можно проще.

Код: Выделить всё
for each fName in createobject("scripting.filesystemobject").getfolder("c:\123").files
debug.pring fName.name
next fname

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 06.12.2005 (Вт) 14:14

А FileListBox на что? Или на API обязательно надо?

beat_swamp
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 05.10.2005 (Ср) 16:16

Сообщение beat_swamp » 06.12.2005 (Вт) 14:54

RayShade твой кусочек не работает1 +/ хотя он такой привликательный1 ;)

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 06.12.2005 (Вт) 16:09

Я уже давал код. Ищи по Dir.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 06.12.2005 (Вт) 16:18

Вот пример, минимум кода, всё стандартное (ничего подключать не надо).
Вложения
FileList.rar
(1.17 Кб) Скачиваний: 301

beat_swamp
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 05.10.2005 (Ср) 16:16

Сообщение beat_swamp » 06.12.2005 (Вт) 16:24

Matew, на объявлении этой функции
Код: Выделить всё
Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long

компилятор ругается1 +( говорит: "Compile error: User-defined type not defined"1 я понимаю что он походу ругается на WIN32_FIND_DATA. как с этим бороться? +/

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 06.12.2005 (Вт) 16:31

beat_swamp на кой тебе через API?
Мой пример даже не посмотрел.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 06.12.2005 (Вт) 16:34

Пример из API-Guide:

Код: Выделить всё


'Create a form with a command button (command1), a list box (list1)
'and four text boxes (text1, text2, text3 and text4).
'Type in the first textbox a startingpath like c:\
'and in the second textbox you put a pattern like *.* or *.txt

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

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
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

Function FindFilesAPI(path As String, SearchStr As String, FileCount As Integer, DirCount As Integer)
    'KPD-Team 1999
    'E-Mail: KPDTeam@Allapi.net
    'URL: http://www.allapi.net/

    Dim FileName As String ' Walking filename variable...
    Dim DirName As String ' SubDirectory Name
    Dim dirNames() As String ' Buffer for directory name entries
    Dim nDir As Integer ' Number of directories in this path
    Dim i As Integer ' For-loop counter...
    Dim hSearch As Long ' Search Handle
    Dim WFD As WIN32_FIND_DATA
    Dim Cont As Integer
    If Right(path, 1) <> "\" Then path = path & "\"
    ' Search for subdirectories.
    nDir = 0
    ReDim dirNames(nDir)
    Cont = True
    hSearch = FindFirstFile(path & "*", WFD)
    If hSearch <> INVALID_HANDLE_VALUE Then
        Do While Cont
        DirName = StripNulls(WFD.cFileName)
        ' Ignore the current and encompassing directories.
        If (DirName <> ".") And (DirName <> "..") Then
            ' Check for directory with bitwise comparison.
            If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
                dirNames(nDir) = DirName
                DirCount = DirCount + 1
                nDir = nDir + 1
                ReDim Preserve dirNames(nDir)
            End If
        End If
        Cont = FindNextFile(hSearch, WFD) 'Get next subdirectory.
        Loop
        Cont = FindClose(hSearch)
    End If
    ' Walk through this directory and sum file sizes.
    hSearch = FindFirstFile(path & SearchStr, WFD)
    Cont = True
    If hSearch <> INVALID_HANDLE_VALUE Then
        While Cont
            FileName = StripNulls(WFD.cFileName)
            If (FileName <> ".") And (FileName <> "..") Then
                FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow
                FileCount = FileCount + 1
                List1.AddItem path & FileName
            End If
            Cont = FindNextFile(hSearch, WFD) ' Get next file
        Wend
        Cont = FindClose(hSearch)
    End If
    ' If there are sub-directories...
    If nDir > 0 Then
        ' Recursively walk into them...
        For i = 0 To nDir - 1
            FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "\", SearchStr, FileCount, DirCount)
        Next i
    End If
End Function
Sub Command1_Click()
    Dim SearchPath As String, FindStr As String
    Dim FileSize As Long
    Dim NumFiles As Integer, NumDirs As Integer
    Screen.MousePointer = vbHourglass
    List1.Clear
    SearchPath = Text1.Text
    FindStr = Text2.Text
    FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs)
    Text3.Text = NumFiles & " Files found in " & NumDirs + 1 & " Directories"
    Text4.Text = "Size of files found under " & SearchPath & " = " & Format(FileSize, "#,###,###,##0") & " Bytes"
    Screen.MousePointer = vbDefault
End Sub

[/syntax]

beat_swamp
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 05.10.2005 (Ср) 16:16

Сообщение beat_swamp » 06.12.2005 (Вт) 16:38

keks-n, спасибо1 я не видел твоего поста когда писал последнюю мессагу1
разобрался спасибо1

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 06.12.2005 (Вт) 16:41

2 All

Заколебали уже своим API. Вы что, консервную банку чтобы открыть, строите сперва сталеплавильный завод?

beat_swamp

Ну а что, орфографию не проверить? ну не pring а print.

А так, код рабочий.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 06.12.2005 (Вт) 16:56

RayShade см. пост выше, там в 6 строк чере FileListBox.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 06.12.2005 (Вт) 16:57

keks-n

или 3 строки через FSO.

И не надо вешать невидимых контролов никуда :)

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 06.12.2005 (Вт) 17:02

FSO-это конечно хорошо... Но когда у меня на нескольких компах выдало "ActiveX component can not create a object", я его использовать перестал.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 06.12.2005 (Вт) 18:05

keks-n

Ну так, надо ставить библу то перед использованием :)

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 06.12.2005 (Вт) 18:08

Не люблю таскать за собой библы...
Изображение

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 06.12.2005 (Вт) 18:17

Ага. А контрол, по твоему, на тебя с неба свалится? :)

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 06.12.2005 (Вт) 18:25

Ну если уж на то пошло то без Run-time'а вообще ничего работать не будет.
Изображение

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 06.12.2005 (Вт) 18:28

Runtime тут не при чем :)

Просто использование контрола filelist - это совершенно неверное идеологически решение.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 06.12.2005 (Вт) 20:53

Нет, ну я не могу...

Ведь сказал, что код давал, без FSO, без API...
Так лень им всем, понимаешь, поиском воспользоваться :evil:

Прямая ссылка на топик с кодом: http://bbs.vbstreets.ru/viewtopic.php?t ... hlight=dir
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 198

    TopList