powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как перебрать все папки в текущем каталоге командой Dir
25 сообщений из 67, страница 1 из 3
Как перебрать все папки в текущем каталоге командой Dir
    #35126964
Dimon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно перебрать все папки в текущем каталоге не заходя в подкаталоги.

Делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
Dim tmp As String
tmp = Dir("d:\*.*")
Do While Len(tmp) >  0 
  tmp = Dir()
 Okno1.Text = Okno1.Text & tmp
Loop
Окно остается пустым!
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35127040
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в справке написано, что это невозможно
Код: plaintext
1.
 you can't call the  Dir  function recursively.
Вы не можете вызвать функцию Dir рекурсивно
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35127088
Dimon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем так.

На данный момент удалось выяснить, что это

Код: plaintext
1.
2.
3.
4.
5.
6.
Dim tmp As String 
tmp = Dir("d:\", vbDirectory) 
Do While Len(tmp) >  0  
 Okno1.Text = Okno1.Text & tmp 
  tmp = Dir() 
Loop

Работает. Но папки, начинающиеся с цифры она не видит. Впрочем, и так годится, но хотелось бы узнать почему.
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35127142
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пишут, что
"Рекуррентное применение Dir (в последующих вызовах уже без аргументов) используется только для перечисления файлов"
это из книги по VB 6.0
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35127156
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вероятно у них атрибут не только "vbDirectory"

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35127209
Dimon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но это же работает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim Tmp As String, I As Integer, Kstr As String 
Tmp = Dir("D:\", vbDirectory) 
Do While Len(Tmp) >  0  
  ReDim Preserve DirArray(I) 
  DirArray(I) = Tmp 
  I = I +  1  
  Okno1.Text = Okno1.Text & Tmp + Chr( 13 ) + Chr( 10 ) 
  Tmp = Dir() 
Loop

Ошибка мной обнаружена: строку Tmp = Dir() нужно было поместить после запоминания первого элемента. Иначе первый путь (созданный строкой Tmp = Dir("D:\", vbDirectory)) просто не запоминался.

Попутно встал еще один вопрос: Как вместо пути Dir("d:\", vbDirectory) подставить текущий путь?
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35127247
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_
"Рекуррентное применение Dir (в последующих вызовах уже без аргументов) используется только для перечисления файлов"
это из книги по VB 6.0

Как хорошо что я не читал таких книжек...
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35127253
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimon111
Попутно встал еще один вопрос: Как вместо пути Dir("d:\", vbDirectory) подставить текущий путь?

F1 и смотреть:

App.Path
CurDir
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35127264
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_в справке написано, что это невозможно
Код: plaintext
1.
 you can't call the  Dir  function recursively.
Вы не можете вызвать функцию Dir рекурсивно


Для перебора файлов/папок не заходя в подкаталоги даром не нужен рекурсивный вызов чего либо.
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35127333
Dimon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как обойтись без рекурсии?
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35127400
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а книга называется Карoль "Справочник с примерами" Visual Basic 6.0 страница 81
далее автор книги пишет, что
"Однако перечислить, например субкаталоги данного каталога с помощью такого кода, как
Код: plaintext
1.
2.
3.
4.
5.
Dim sNextDir
Debug.Print Dir ("c:\windows\*", vbdirectory)
Do
   sNextDir = Dir
   Debug.Print sNextDir
Loop Until sNextDir = ""
нельзя. Вызовы Dir без аргументов будут возвращать подряд и файлы и каталоги.

виноват, неверно понял.
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35127762
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторнельзя. Вызовы Dir без аргументов будут возвращать подряд и файлы и каталоги.

Но можно проверить атрибут с помощью GetAttr и узнать что это: файл или каталог


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35129063
Dimon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как все - таки релизовать Dir из текущего катклога, чтобы не указывать конкретного пути?

App.Path, CurDir выдает лишь текущий рабочий каталог (папку в которой назодится программа): Dir(App.Path, vbDirectory).

Спасибо
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35351820
UZER2006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Недостаток/преимущество CurDir(), App.Path в том, что они возвращаю значения в формате "x:\<>foldername". Это есть адрес и имя конкретной папки, а не ссылка на ее "внутренности". :-)
Добавь к этому в вызове функции Dir символ "\" - и он уже работает внутри папки. :-)
Dir(CurDir()+"\")
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35351866
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего-то не понял. Зачем вам рекурсии-то, раз в подкаталоги не заходите? Вот у вас:

" Нужно перебрать все папки в текущем каталоге не заходя в подкаталоги ..."
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35351924
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    Dim objFSO As New FileSystemObject
    Dim objFolder As Folder

    Set objFolder = objFSO.GetFolder("C:\")
    
    For Each objFolder In objFSO.GetFolder("C:\").SubFolders
        Debug.Print objFolder.Name
    Next objFolder
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35353886
AndreyMp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и на API
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
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 INVALID_HANDLE_VALUE = - 1 
Const FILE_ATTRIBUTE_DIRECTORY = &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

Function FindFolderAPI(path As String)
    Dim DirName As String
    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 & "\"
    Cont = True
    hSearch = FindFirstFile(path & "*", WFD)
    If hSearch <> INVALID_HANDLE_VALUE Then
        Do While Cont
        DirName = WFD.cFileName
        If (DirName <> ".") And (DirName <> "..") Then
            If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
                List1.AddItem DirName
            End If
        End If
        Cont = FindNextFile(hSearch, WFD)
        Loop
        Cont = FindClose(hSearch)
    End If
End Function
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35354751
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreyMpНу и на API

По скорости это, кстати, не отличается от Dir или FileSystemObject...
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35354861
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут уместно вспомнить, что FileSystemObject и есть собрание всех этих API, удобное для потребления и позволяющее не мучиться с длинным и нетривильным для быстрого восприятия кодом.
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35354977
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несколько упрощу свой пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    Dim objFSO As New FileSystemObject
    Dim objFolder As Folder

    Set objFolder = objFSO.GetFolder("C:\")
    
    For Each objFolder In objFolder.SubFolders
        Debug.Print objFolder.Name
    Next objFolder

Не считая описания переменных, всего четыре строчки, включая Debug.
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35355019
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: VladConn
> Несколько упрощу свой пример:
>
>
> Dim objFSO As New FileSystemObject
> 'Dim objFolder As Folder
Нет, ну если упрощать, так упрощать ;)
Эта строка не нужна, т.к нет проверки на валидность возвращаемого значения
> 'Set objFolder = objFSO.GetFolder("C:\")
>

И поэтому вызов можно подставить сразу в цикл
> For Each objFolder In objFSO.GetFolder("C:\").SubFolders
> Debug.Print objFolder.Name
> Next objFolder
> Не считая описания переменных, всего четыре строчки, включая Debug.

Получилось четыре считая объявление переменной. :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35355057
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угу! Тем более!

:0)
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35355778
AndreyMp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторAndreyMp
Ну и на API

По скорости это, кстати, не отличается от Dir или FileSystemObject...
Ну это я так. Можно считать, для коллекции. Конечно проще пользоваться FSO. Сам ей часто пользуюсь.
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35357312
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Им

:0)
...
Рейтинг: 0 / 0
Как перебрать все папки в текущем каталоге командой Dir
    #35358563
AndreyMp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, File System Object, конечно им .
...
Рейтинг: 0 / 0
25 сообщений из 67, страница 1 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как перебрать все папки в текущем каталоге командой Dir
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]