Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/207: Рейтинг темы: голосов - 207, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 6
1

Как получить список папок в заданной директории

29.02.2012, 16:11. Показов 41537. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите как получить список папок в заданной директории (при этом имена файлов в список попадать не должны)?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.02.2012, 16:11
Ответы с готовыми решениями:

Список файлов и папок в заданной директории
Всем здравствуйте. Скажите как получить дерево файлов и папок в заданной дериктории? И все это в...

Получить список папок в заданной директории и вывести в ListBox
Работаю в vb2010. Как можно узнать список папок, которые находятся в данной директории:...

Как получить список файлов и папок в директории
Как получить список файлов и папок в директории (именно в директории, без файлов подпапок)?

Получить список файлов и папок в директории
Вот такой вопрос возник, допустим я хочу написать что то типа файлового менеджера, как мне получить...

9
5612 / 1596 / 414
Регистрация: 23.12.2010
Сообщений: 2,389
Записей в блоге: 1
29.02.2012, 17:43 2
Лучший ответ Сообщение было отмечено как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dim Folders() As String
Sub Subfolders_in(Folder$)
    Dim N%
    Dim fs, f, f1, fc
 
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder(Folder)
    Set fc = f.SubFolders
 
    N = 0
    On Local Error Resume Next
    For Each f1 In fc
      N = N + 1
      ReDim Preserve Folders(1 To N) As String
      Folders(N) = Folder & "\" & f1.Name & "\"
   Next f1
End Sub
Список с полными путями в массиве Folders()
1
Эксперт WindowsАвтор FAQ
18007 / 7708 / 892
Регистрация: 25.12.2011
Сообщений: 11,481
Записей в блоге: 16
29.02.2012, 18:32 3
Вариант:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub Dirs()
Dim myName$, myPath$, N%, Folders$()
On Local Error Resume Next
myPath = InputBox("Введите директорию", , "c:\temp\")
If Right(myPath, 1) <> "\" Then myPath = myPath & "\"
If Dir(Left(myPath, Len(myPath) - 1), 16) = "" Then MsgBox "Папка не существует!": Exit Sub
myName = Dir(myPath, vbDirectory)
Do While myName <> ""
  If GetAttr(myPath & myName) = vbDirectory And myName <> "." Then
    N = N + 1
    ReDim Preserve Folders$(1 To N)
    Folders(N) = myPath & myName
  End If
  myName = Dir()
Loop
MsgBox Join(Folders, vbLf)
End Sub
Результат аналогично в массиве Folders.

KoGG, а строку 11 лучше перенести в позицию № 5, т.к. при задании несуществующего диска выбьет ошибку на строке 7.
2
Заблокирован
29.02.2012, 18:39 4
А можно и стандартными VB-средствами обойтись
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Option Explicit
 
Function Get_DirS(path As String)
Dim a() As String, D As String, U As Long
D = Dir(path, vbDirectory)
While D <> ""
  If GetAttr(path & "\" & D) And vbDirectory Then
    ReDim Preserve a(U)
    a(U) = path & D
    U = U + 1
  End If
  D = Dir
Wend
Get_DirS = a
End Function
 
Sub Get_DirS_Example()
Dim a
a = Get_DirS("C:\Documents and Settings\")
End Sub
Причем работают они зачастую быстрее стронних библиотек.

Добавлено через 4 минуты
Цитата Сообщение от Diskretor Посмотреть сообщение
If GetAttr(myPath & myName) = vbDirectory And myName <> "." Then
Visual Basic
1
If GetAttr(myPath & myName) = vbDirectory And myName <> "."  And myName <> ".." Then
И так даже приходилось писать
3
Эксперт WindowsАвтор FAQ
18007 / 7708 / 892
Регистрация: 25.12.2011
Сообщений: 11,481
Записей в блоге: 16
29.02.2012, 18:47 5
Апострофф, да, я был не прав. vbDirectory=32, если папка в корне и = 16, если это подкаталог.

Эту строку 'If GetAttr(path & "\" & D) And vbDirectory Then' я, конечно, подсмотрел на MSDN, но нифига не понял зачем там 'vbDirectory). А вот "." и ".." нужно фильтровать.

Также не вкурил почему в руководстве пишется - команда Dir запоминает параметры первого вызова, но в моем коде она все равно выводит в т.ч. имена файлов.

И еще вопрос: написано, что нужно ставить двойные кавычки Chr(34), если в имени папки есть пробелы. Но у меня все работает и без них. И наоборот ничего не выдает/работает неверно, если их указать.
1
Заблокирован
29.02.2012, 19:53 6
Лучший ответ Сообщение было отмечено как решение

Решение

А что бы в список попали всякие с причудами директории, можно написать так -
Visual Basic
1
2
3
4
D = Dir(path, vbDirectory Or vbHidden Or vbSystem)
While D <> ""
  If GetAttr(path & "\" & D) And vbDirectory And D <> "."  And D <> ".." Then
  'далее по тексту
Упсс: Это была добавка к четвёртому посту.

Добавлено через 31 минуту
Цитата Сообщение от Diskretor Посмотреть сообщение
Эту строку 'If GetAttr(path & "\" & D) And vbDirectory Then' я, конечно, подсмотрел на MSDN, но нифига не понял зачем там 'vbDirectory).
...она все равно выводит в т.ч. имена файлов.
На уровне подсознания я понимаю эту фишку, но сомневаюсь, сумею ли внятно объяснить
Но попробую-
Цитата Сообщение от F1
Dir[(pathname[, attributes])]
The attributes argument settings are:
Constant Value Description
vbNormal 0 (Default) Specifies files with no attributes.
vbReadOnly 1 Specifies read-only files in addition to files with no attributes.
vbHidden 2 Specifies hidden files in addition to files with no attributes.
VbSystem 4 Specifies system files in addition to files with no attributes
vbVolume 8 Specifies volume label; if any other attributed is specified, vbVolume is ignored
vbDirectory 16 Specifies directories or folders in addition to files with no attributes.
Dir ищет по сумме аттрибутов, поэтому 0 (vbNormal) на него не влияет, что бы ни указали в параметре attributes, поэтому и попадают в результат обычные (vbNormal) файлы.
А потому и необходима дополнительная фильтрация... Вот(уж как сумел)

Добавлено через 21 минуту
То есть
Visual Basic
1
Dir(path, vbDirectory Or vbNormal)
и
Visual Basic
1
Dir(path, vbDirectory)
одно и тоже, с точки зрения Dir!

Добавлено через 6 минут
Цитата Сообщение от Diskretor Посмотреть сообщение
И еще вопрос: написано, что нужно ставить двойные кавычки Chr(34), если в имени папки есть пробелы. Но у меня все работает и без них. И наоборот ничего не выдает/работает неверно, если их указать.
Тоже с этим сталкивался неоднократно
Сделал вывод - для Dir это не нужно,
а для Shell и т.п. необходимо...
3
9 / 9 / 0
Регистрация: 05.05.2011
Сообщений: 66
05.01.2013, 20:23 7
А зачем так все сложно, когда можно использовать объект Enumerator
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var FSO,F,SFold,SubFolders,s;
FSO=WScript.CreateObject("Scripting.FileSystemObject");
//Путь к каталогу
SFold="C:\\Program Files";
s="Каталог "+SFold+"\n";
s+="Подкаталоги:\n";
//Создаем объект Folder для каталога C:\Program Files
F=FSO.GetFolder(SFold);
//Создаем коллекцию подкаталогов каталога C:\Program Files
SubFolders= new Enumerator(F.SubFolders);
//Цикл по всем подкаталогам
for (; !SubFolders.atEnd(); SubFolders.moveNext()) {
  s+=SubFolders.item()+"\n";  //Добавляем строку с именем подкаталога
  }
//Выводим полученные строки на экран
WScript.Echo(s);
P.S. код не мой, но всегда пользуюсь им, как шаблоном
0
15147 / 6420 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
05.01.2013, 20:29 8
Smith&Wesson, в посте #2 то же самое, только на другом языке, и результат в массиве.
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
05.01.2013, 21:03 9
Smith&Wesson, вы ошиблись разделом форума. Здесь обсуждается язык программирования VBA.
0
9 / 9 / 0
Регистрация: 05.05.2011
Сообщений: 66
05.01.2013, 21:13 10
Только заметил, что ветка по VBA В таком случае, функция будет следующая:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'Объявляем переменные
Dim FSO, SFold, SubFolders, sFlds, tsOut 
 
'Создаем объект FileSystemObject
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
'Создаем файл, куда будем записывать имена подкаталогов
Set tsOut = FSO.CreateTextFile("output.txt", True, False) 
'Путь к корневому каталогу
SFold = "C:\Program Files\"
Set Folder = FSO.GetFolder(SFold)
'Цикл по всем подкаталогам
for Each SubFolder In Folder.SubFolders
         sFlds = SFold & SubFolder.Name
'Выводим полученные строки в файл output.txt
         tsOut.WriteLine sFlds
Next
         tsOut.Close
WScript.Quit
Добавлено через 3 минуты
Цитата Сообщение от Казанский Посмотреть сообщение
Smith&Wesson, в посте #2 то же самое, только на другом языке, и результат в массиве.
Да... Вы правы. Только смысл массив городить для таких простых вещей?
На VB данная стандартная функция, по-моему, ещё проще и понятнее. ИМХО...
Может не прав, но всегда считал, чем проще и меньше код - тем лучше.
0
05.01.2013, 21:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2013, 21:13
Помогаю со студенческими работами здесь

Список всех файлов и папок указанной директории по заданной маске
Здравствуйте! Требуется написать программу, используя FileNameFilter которая выведет на экран...

Отобразить в консольном окне список всех папок заданной директории
Отобразить в консольном окне список всех папок заданной (любой) директории. В случае её отсуствия...

Получить список всех папок и подпапок в директории
Нужно получить список всех папок, подпапок и файлов в них - из указанной директории.

Получить список файлов в заданной директории
Доброго времени суток! Раздобыл код с получением списком файлов: #include &lt;iostream&gt; #include...

Получить список всех файлов в заданной директории
помогите, плз. Каким способом можна выгрести все файлы (dbf, xls и т. д.) в заданной директории...

Как получить имена всех папок в определенной директории?
Как получить имена всех папок(не файлов!) в данной дир-ие?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru