Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как перебрать все папки в текущем каталоге командой Dir / 25 сообщений из 67, страница 1 из 3
12.02.2008, 14:06
    #35126964
Dimon111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
Нужно перебрать все папки в текущем каталоге не заходя в подкаталоги.

Делаю так:
Код: 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
12.02.2008, 14:22
    #35127040
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
в справке написано, что это невозможно
Код: plaintext
1.
 you can't call the  Dir  function recursively.
Вы не можете вызвать функцию Dir рекурсивно
...
Рейтинг: 0 / 0
12.02.2008, 14:34
    #35127088
Dimon111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
Не совсем так.

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

Код: 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
12.02.2008, 14:48
    #35127142
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
пишут, что
"Рекуррентное применение Dir (в последующих вызовах уже без аргументов) используется только для перечисления файлов"
это из книги по VB 6.0
...
Рейтинг: 0 / 0
12.02.2008, 14:52
    #35127156
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
вероятно у них атрибут не только "vbDirectory"

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

Код: 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
12.02.2008, 15:09
    #35127247
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
klen_
"Рекуррентное применение Dir (в последующих вызовах уже без аргументов) используется только для перечисления файлов"
это из книги по VB 6.0

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

F1 и смотреть:

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


Для перебора файлов/папок не заходя в подкаталоги даром не нужен рекурсивный вызов чего либо.
...
Рейтинг: 0 / 0
12.02.2008, 15:22
    #35127333
Dimon111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
Как обойтись без рекурсии?
...
Рейтинг: 0 / 0
12.02.2008, 15:35
    #35127400
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
а книга называется Кар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
12.02.2008, 16:50
    #35127762
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
авторнельзя. Вызовы Dir без аргументов будут возвращать подряд и файлы и каталоги.

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


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

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

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

" Нужно перебрать все папки в текущем каталоге не заходя в подкаталоги ..."
...
Рейтинг: 0 / 0
03.06.2008, 17:12
    #35351924
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
Код: 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
04.06.2008, 13:13
    #35353886
AndreyMp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
Ну и на 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
04.06.2008, 17:27
    #35354751
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
AndreyMpНу и на API

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

Код: 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
04.06.2008, 19:33
    #35355019
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
> Автор: 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
04.06.2008, 19:56
    #35355057
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перебрать все папки в текущем каталоге командой Dir
Угу! Тем более!

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

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

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


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