Как перебрать все папки в текущем каталоге командой Dir

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

Как перебрать все папки в текущем каталоге командой Dir

Сообщение Dimon111 » 12.02.2008 (Вт) 14:07

Нужно перебрать все папки в текущем каталоге не заходя в подкаталоги.

Делаю так:
Код: Выделить всё
Dim tmp As String
tmp = Dir("d:\*.*")
Do While Len(tmp) > 0
  tmp = Dir()
Okno1.Text = Okno1.Text & tmp
Loop

Окно остается пустым!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Как перебрать все папки в текущем каталоге командой Dir

Сообщение Viper » 12.02.2008 (Вт) 14:16

Код: Выделить всё
Dim tmp As String
tmp = Dir("d:\", vbDirectory)
Do While Len(tmp) > 0
Okno1.Text = Okno1.Text & tmp
  tmp = Dir()
Loop
Весь мир матрица, а мы в нем потоки байтов!

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 12.02.2008 (Вт) 14:21

Dir("D:\", vbDirectory)

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 12.02.2008 (Вт) 14:32

Весьма занятно. Работает, но хитро.

Папки, начинающиеся с цифры она не видит. Впрочем, и так годится, но хотелось бы узнать почему.

И что это за волшебная vbDirectory? Подозреваю, что тоже самое, что и dir /b в bat - файле.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 12.02.2008 (Вт) 14:55

Все оказалось просто.

Код: Выделить всё
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)) просто не запоминался.

Всем спасибо. Без вашей помощи не разобрался бы.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 12.02.2008 (Вт) 14:59

Попутно встал еще один вопрос: Как вместо пути Dir("d:\", vbDirectory) подставить текущий путь?

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

Сообщение alibek » 12.02.2008 (Вт) 15:01

vbDirectory означает, что будут перебираться только файлы с установленным атрибутом "каталог" (то есть каталоги).
Код правильный, но ты учитывай, что надо исключить обработку элементов "." и "..".

Текущий путь надо запоминать во вспомогательной переменной.
Lasciate ogni speranza, voi ch'entrate.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 12.02.2008 (Вт) 15:20

Это у меня дальше происходит - фильтрация "." и "..":

Код: Выделить всё
    Kstr = DirArray(I)                     
    Exist = InStr(Kstr, ".")                 
    If Exist = 0 Then Okno1.Text = Okno1.Text + "C:\Progra~1\7-Zip\7zg.exe" + " " + "A" + " " + Kstr + " " + Kstr + "\" + Chr(13) + Chr(10)
    If Exist = 0 Then Print #1, "C:\Progra~1\7-Zip\7zg.exe" + " " + "A" + " " + Kstr + " " + Kstr + "\" + Chr(13) + Chr(10)

Как запомнить текущий путь?

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 12.02.2008 (Вт) 16:18

А что фактически означают "." и ".." в некоторых каталогах?Возвращаются обычно первыми DIR()`ом.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.02.2008 (Вт) 16:20

1) Это не фильтрафия, а проверка, содержит ли имя катола точку. Таким образом любой каталог (например каталог "18.03.2008") ощутит всю прелесть облома, хотя, по идее, не должен.

2) "C:\Progra~1\7-Zip\7zg.exe" + " " + "A" + " " + - это новая разновидность мазохизма?

В таком случае, рекоммендую писать:
"C" + ":" + "\" + "P" + "r" + "o" + "g" + и т.д. :)

3) Вопрос о текущем путе не ясен.

Proxy
. - означает текущий каталог.
.. - вышестоящий.

c:\windows\..\windows\.\.\.\system32\..\..\.\windows\system32\ - всё равно что c:\windows\system32.

Полезно для указания текущий путей. Допустим, наш exe-шник лежит в папке bin, которая лежит в папке soft, в которой лежит папка data, в которой лежат данные.

Вместо того, чтобы получать CurDir (которая у нас пусть будет = App.Path) (c:\foo\bar\bazz\quux\soft\bin\), отрезать от полученного пути \bin и прибавлять data\ можем просто напистать
Open "..\data\file.dat"
Последний раз редактировалось Хакер 12.02.2008 (Вт) 16:35, всего редактировалось 1 раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 12.02.2008 (Вт) 16:34

Ну конечно правильней было бы все в одни кавычки взять.

Вопрос о пути - программадолжна работать с с того пути, в котором она находится.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.02.2008 (Вт) 16:37

Dimon111
Вопрос о пути - программадолжна работать с с того пути, в котором она находится.


Как понимать работу программы с какого-то пути?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 12.02.2008 (Вт) 17:20

Программе необходим список папок того директория, в котором она находится. А он может быть разный.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 13.02.2008 (Ср) 10:37

Как все - таки релизовать Dir из текущего катклога, чтобы не указывать конкретного пути?

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

Спасибо

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

Сообщение alibek » 13.02.2008 (Ср) 11:56

BasePath = App.Path
If Right$(BasePath,1) <> "\" Then BasePath = BasePath & "\"
...
res = Dir$(BasePath, vbDirectory)
Do Until Len(res) = 0
Debug.Print BasePath & res
res = Dir$
Loop
Lasciate ogni speranza, voi ch'entrate.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 13.02.2008 (Ср) 12:31

Не ужели проще нельзя? Задача - то вобщем простая. Получить список папок в том же месте где находится программа.

До сих пор делал это в bat - файле: Dir / и >L.txt

Т.е. создавал специально bat - файл с такой командой, запускал его из программы, далее открывал L.txt и анализировал его. Но такая кривизна достала. Хотелось найти более изящное решение.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.02.2008 (Ср) 12:34

Хотелось найти более изящное решение.

И Алибек написал тебе его. Чем ты недоволен?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 13.02.2008 (Ср) 12:46

Разобрался. Работает. Просто думал, что наряду с App.Path, CurDir есть еще что - нибудь.

Еще непонятно Dir$(BasePath, vbDirectory) должно по идее выводить только папки, а она выводит еще и файлы.

Спасибо.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.02.2008 (Ср) 13:01

Dimon111
Ты вообще знаешь, какая разница между App.Path и CurDir ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 13.02.2008 (Ср) 13:25

А чем не подходит:
Код: Выделить всё
Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 13.02.2008 (Ср) 13:34

Хакер писал(а):Dimon111
Ты вообще знаешь, какая разница между App.Path и CurDir ?

Стыдно признаться, но нет.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.02.2008 (Ср) 14:13

Стыдно должно быть не признаваться, а скрывать это, и выдавать за мнимо знание.

App.Path - это путь к образу (т.е. к exe-файлу или dll, в случае, если проект - dll-библа) исполняемого файла. Он всегда неизменен.

При этом, есть один досадный момент - App.Path имеет такой вид:
C:\
D:\
E:\
A:\
C:\WINDOWS
D:\Program Files

Т.е. нужно всегда проверять, если ли \ в конце.

Функция CurDir возвращает строку, содержащую текущий каталог процесса. У каждого процесса есть свой текущий каталог. И причём - для каждого диска.

Если приложение запускается просто так - текущий каталог будет совпадать с App.Path . Очень многие страдают из-за того что принимают этот факт как закон. CurDir совпадает с App.Path - но лишь иногда.

CurDir может меняться, и при том - кем угодно. Например, CommonDialog при работе файловых диалогов меняет CurDir. Поэтому у некоторых особо одарённых после CommonDialog.ShowOpen (например) где-нибудь в коде выполняется Open "config.dat" For Input As #1, и их приложение тупо умирает с 51:File not found. Они (особо одарённые) конечно потом орут, дескать - VB - самый глючный язык. Однако глючный не VB, а глючные мозги этих одарённых долбодятлов. Кстати говоря, на этом форуме такие тоже обитают.

Так вот. Кроме того, программист сам может менять текущий каталог функциями ChDir (изменяет сам каталог) и ChDrive (изменяет диск).

Следующая простыня из Immediate Pane должно помочь понять смысл текущего пути:


? curdir
C:\Program Files\Microsoft Visual Studio\VB98
chdir ".."
? curdir
C:\Program Files\Microsoft Visual Studio
chdir "c:\windows\system32"
? curdir
c:\windows\system32
chdir "drivers\etc\.\..\..\..\.\.\.\fonts\"
? curdir
c:\windows\fonts
chdrive "j:"
? curdir
J:\
chdir "soft"
chdir "fasmw167"
? curdir
J:\soft\fasmw167
chdir "\projects\fbrtl"
? curdir
J:\soft\fasmw167\projects\fbrtl
chdir ".."
chdrive "c:"
chdir ".."
? curdir
c:\windows
chdrive "j:"
? curdir
J:\soft\fasmw167\projects
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 13.02.2008 (Ср) 14:35

Спасибо. Просвятили. Да, во многих глюках виноваты мы сами.

Хотя следующая строчка честно говоря завела меня в тупик:

chdir "drivers\etc\.\..\..\..\.\.\.\fonts\"

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.02.2008 (Ср) 14:54

Хотя следующая строчка честно говоря завела меня в тупик:

chdir "drivers\etc\.\..\..\..\.\.\.\fonts\"


Давай по порядку.

ChDir меняет текущий каталог. В качестве аргумента принимается либо полный путь (абсолютный) либо относительный. В данном случае - путь относительный.

Все относительные пути при работе с файлоыми операциями "отсчитываются" как раз относительно текущего каталога.

Перед вызовом функции текущий каталог - c:\windows\system32

Я уже говорил, что \. - это относительный путь к текущему каталогу, а \.. - относительный путь к родительскому каталогу. Т.е. в принципе все \. можно вообще убрать, - они ничего не меняют и вписаны здесь для устрашения.

Тогда получим относительный путь "drivers\etc\..\..\..\fonts\"

будем отщеплять от относительного пути уровни слева направо и присоединять их к текущему пути.

"c:\windows\system32\" +"drivers\etc\..\..\..\fonts\" =>
=> "c:\windows\system32\drivers\" + "etc\..\..\..\fonsts\"

"c:\windows\system32\drivers\" + "etc\..\..\..\fonts\" =>
=> "c:\windows\system32\drivers\etc\" + "..\..\..\fonts"

"c:\windows\system32\drivers\etc\" + "..\..\..\fonts"=>
=> "c:\windows\system32\drivers\etc\..\" + "..\..\fonts"=>
=> "c:\windows\system32\drivers\" + "..\..\fonts"

( потому что \a\b\c\.. эквивалетно \a\b\ так как .. означает родительский каталог \a\b\c\, а родительский каталог \a\b\c\ это и есть \a\b\ )

Дальше я думаю понятно?
Последний раз редактировалось Хакер 13.02.2008 (Ср) 15:04, всего редактировалось 1 раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 13.02.2008 (Ср) 15:04

Понял. Спасибо.


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

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

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

    TopList