VBSРазное

VBS — Работа с папками при помощи FSO

Опубликовано

При помощи FSO можно работать с папками. Алгоритм начала работы такой:

1. Объявляем переменную. Не обязательно такое же название, но оно наиболее логичное. А ещё, ваш код будет понятнее для других.

Dim FSO

2. Записываем в переменную FSO копию объекта FileSystemObject, который предназначен для работы с файловой системой Windows

Set FSO=CreateObject(«Scripting.FileSystemObject»)

3. Получаем доступ к папке в переменной fold

Set fold= fso.GetFolder(«c:\Windows\»)

А теперь давайте посмотрим, что мы можем сделать с папками?

fold.Name — получить имя папки

fold.Drive — получить имя диска, на котором находится папка

fold.IsRootFile — является ли корневым каталогом

fold.DateCreated — получить дату создания папки

fold.DateLastModified — получить дату последнего изменения

fold.DateLastAccessed — Дата последнего доступа

fold.ShortName — Получить короткое имя папки

fold.Shortpath — Получить короткий путь

fold.Attributes — получить атрибуты

0 — Normal. Обычный файл (нет атрибутов).
1 — ReadOnly. Файл только для чтения. Чтение и запись.
2 — Hidden. Скрытый. Чтение и запись.
4 — System. Системный. Чтение и запись.
8 — Volume. Диск. Только чтение.
16 — Directory. Папка или файл. Только чтение.
32 — Archive. Архивный. Чтение и запись.
1024 — Alias. Ссылка или ярлык. Только чтение.
2048 — Compressed. Сжатый. Только чтение.

fold.Size — Размер папки

fold.Type — Тип папки(Локальный диск, папка с файлами и т.д.)

А так же непосредственно с FSO:

fso.GetBaseName(fold) — получить имя папки

fso.GetParentFolderName(fold) — получить имя родительской папки для указанной

fso.CreateFolder («C:\example) — создать папку с именем example на диске C

fso.DeleteFolder («C:\example») — удалить папку C:\Example

fso.GetAbsolutePathName(«.») — получить текущий каталог(откуда запускается скрипт)

fso.FolderExists(fold) — Проверяет, существует ли папка

fso.MoveFolder ( откуда, куда ) — перемещение папки

fso.BuildPath(Католог, подкаталог) — вернёт путь каталог\подкаталог

Например fso.BuildPath(«C:\Windows», «System32») вернёт C:\Windows\System32

Коллекция SubFolders
Так же есть очень полезная коллекция — SubFolders

Set subfold = f.SubFolders

Теперь мы получили доступ к подкаталогам выбранного каталога в переменную subfold. Давайте взглянем на простой пример использования коллекции SubFolders:

001

Давайте разберёмся поподробнее. Итак, вводим путь в переменную Path. Далее в переменную FSO копируем объект FileSystemObject(строка2). Далее при условии, что путь существует(строка 4, FolderExists) мы в переменную oFolders получаем доступ к папке по указанному пути(строка 5). Далее мы в переменную oSubFolders получаем коллекцию SubFolders в переменную oSubFolders(строка 6). Далее мы начинаем цикл For Each для каждого элемента, названного нами item в коллекции oSubFolders(та самая переменная, куда мы полуили коллекцию SubFolders) в строке 7. В 8 строке кода мы добавляем к переменной TEMP название папки(item.Name) и выполняем переход на след.строку(chr(13)).

Если каталога не существует, то в переменную TEMP заносится об этом строчка(строка 11). Ну выводим результат в 14 строчке кода. Вот, примерно так и происходит работа с коллекцией.

Так же порой полезно получить количество элементов коллекции. Это нам может понадобится, если мы захотим занести данные о папках в массив.

В прошлом случае, для переменной с коллекцией oSubFolders можно было применить: oSubFolders.count

Это бы нам вернуло количество элементов коллекции.

Вот, вроде бы и всё. Далее будем разбирать задачи. Но прежде, я хотел бы ещё привести 1 полезную штуку, правда не из FSO. Хотел бы её заранее объяснить, чтобы не возникло вопросов.

Конструкция типа:

DIM objShell
Set oShell = CreateObject(«Shell.Application»)

set OTree = objShell.BrowseForFolder( 0, «текст», 0, «C:\»)

Path = objTree.Self.Path
Name = objTree.Self.name

Работа конструкции такова: Создаётся копия объекта в переменную oShell. Далее при помощи метода BrowseFolFolder вызывается окно поиска папки. Первое значение 0 должно быть нулём, далее идёт текст. Далее метод, по которому будет выполнятся отображение, и путь, от которого будет идти поиск. Выше этого пути выйти будет нельзя.

Приведём список методов отображения:

-1 — Отобразит «Рабочий стол» и «Мои документы» с файлами. Имеется возможность создания новой папки. (не рекомендую, т.к. при выборе файла произойдет ошибка)

0 — Будут видны все папки и будет возможность создания папки (кнопка). Корзина видна.

1 — Будут видны все папки и будет возможность создания папки (кнопка). Корзина не видна.

16384 — Отображать файлы и папки

Путь может быть задан и численно. Вот список возможных значений:
DESKTOP = 0
PROGRAMS = 2
DRIVES = 17
NETWORK = 18
NETHOOD = 19
PROGRAMFILES = 38
PROGRAMFILESx86 = 48
WINDOWS = 36

Итак, теперь задачи.

ЗАДАЧИ
ЗАДАЧА 1: Компьютер на любом из существующем локальном диске компьютера ищет произвольную папку и выстраивает произвольной длинны папку. После чего, выдаёт всю информацию по данной папке.

Код довольно большой, поэтому разобьём его на несколько блоков:

002

Итак,  создаём объект FSO, запускаем генератор случайных чисел. Далее расписываем функции(далее на каждой остановимся). Нам нужно сделать 3 разные вещи: Выбрать локальный диск компьютера(первая функция, строки 5-14), Раскрыть каталог и выбрать там ещё каталог(вторая функция, 16-32) и Вывести информацию по каталогу(третья функция, 34-42). Прежде чем мы вернёмся к основному коду давайте рассмотрим работу функций и поймём, как они устроены у нас.

Итак, выбор локального диска на компьютере:

003

Тут всё понятно. Называем нашу функцию DLet и указываем, что у неё нету входящего параметра(скобки пусты). Далее мы создаём в переменную dict копию объекта Dictionary. Это так называемый словарь. Далее мы получаем в переменную Drives коллекцию всех дисков на компьютере(учтите, что не только локальные, но и приводы, сетевые диски и т.д.). Теперь, для каждого элемента в этой коллекции мы выполняем цикл For Each, где при условии, что текущий диск является локальным(D.DriveType=2) заносим о нём данные в «словарь» dict (строка 10). Далее мы получаем случайное число от 1 до количества локальных дисков(строка 12), которое и определяет, какой элемент словаря мы выберем, т.е. какой локальный диск мы выберем(строка 13). В конце функции её названию приравнивается числовое значение. Это то значение, которое наша функция вернёт в основном коде. В 14 строке мы заканчиваем описание нашей функции.

004

Называем функцию, указываем, что у функции есть входной аргумент MyWay. Он так называется только в теле функции. Создаём копию объекта Dictionary, после чего получаем доступ к указанному в пути MyWay папке. Далее, в переменную prov заносим данные о атрибутах папки. Это нам нужно, чтобы избежать ошибки обработки системных папок, т.к. права доступа не позволят нам выполнить просто так скрипт. Однако, если выбран корневой каталог, то он будет системным. Поэтому, нужно сделать проверку, не является ли текущий каталог корневым — Проверку IsRootFolder(Строка 20). Если каталог корневой — сбрасываем параметр атрибутов на ноль, чтобы выполнился цикл. Далее начинаем цикл, в котором в «словарь» заносим все папки. Далее, выбираем случайное число и по этому случайному числу выбираем вложенную папку в указанном входном пути функции(MyWay).

005

Тут всё совсем просто. Называем функцию, указываем, что есть входной параметр. Далее получаем доступ к указанной в FolderPath папке. Далее собираем в возвращаемое функцией значение информацию о папке. В 40 строчке мы так же убеждаемся, что если папка не системная — получить у неё размер. В противном случае, при запросе размера от системной папке мы получим ошибку. Ну и заканчиваем описание функции.

Теперь, вернёмся к основному коду:

006

Итак, тут тоже всё просто. В переменную Path получаем значение функции DLet(), т.е. получаем сюда имя локального диска. Далее в переменную rand получаем случайное число от 1 до 10, это будет показателем уровня вложенности, т.е. на сколько каталогов уходит вглубь дерева папок. Далее, начинаем цикл FOR от 0 до показателя вложенности. Далее в PathADD получаем значение функции BPath по пути Path. Эта функция нам вернёт случайную папку из выбранного каталога. Далее, указываем, что если функция нам вернула просто «\», то либо папка пуста и идти дальше некуда, либо эта папка системная и нужно прекращать выполнение цикла(EXIT FOR). Ну и достраиваем путь Path.

Ну и в самом конце мы выводим получившийся путь Path и выводим значение функции FoldInf по полученному пути Path.

Вот так примерно и работает работа с папками в FSO.