Всем привет, с вами автор блога scriptcoding.ru. В этой статье мы продолжим программировать, а точнее, изучать файловую систему Windows с помощью объекта FileSystemObject и его методов. Сегодня мы рассмотрим два метода, один из них показывает, как скопировать папку или структуру папок программным путем, а другой позволяет добавить к заданному пути дополнительное имя…
Прежде чем приступать к программированию, давайте посмотрим, как скопировать папку в ручном режиме:
Как скопировать папку вручную
Прежде всего, вам нужно открыть директорию или диск, в котором находится пака, которую надо скопировать. Нажимаем правой кнопкой мыши по папке, в появившемся контекстном меню выбираем пункт «Копировать«, нажимаем мышкой по данному пункту. Теперь нам надо открыть тот каталог или диск, в который надо скопировать структуру папок или просто папку. Щелкаем правой кнопкой мыши по пустой области и в появившемся меню выбираем пункт «Вставить«, нажимаем по данному пункту и всё, выбранная папка скопирована. Однако, можно скопировать таким же методом и несколько папок, просто выделяем нужные директории и по одному из них выбираем пункт «Копировать», а уже далее, как и в примере выше, вставляем выбранные документы в нужное место.
Стоит обратить внимание, что скопировать структуру папок проще всего через менеджер файлов, например, Total Commander, он хорош тем, что весь процесс копирования папок позволяет держать под контролем, и вы всегда сможете проверить, все ли данные скопированы. В случае с примером выше, вы можете просто использовать комбинации клавиш «Ctrl + C» и «Ctrl + V«, чтобы скопировать одну или несколько папок в нужное место. Также обратите внимание, что если вы скопируете папки в одно и то же место, то Windows автоматически добавит к их именам префикс, так как папок с одинаковыми именами в одном месте быть не может.
Хорошо, теперь наступило время заняться программированием и описанием методов объекта FileSystemObject:
BuildPath(path, name) – Метод позволяет добавить к заданному пути path новое имя name. Как это работает, мы рассмотрим ниже.
CopyFolder(source, destination [,overwrite]) – Собственно, то, что нам и надо, метод показывает как скопировать папку на диск или в другую директорию.
- source – Путь к папке, которую нужно скопировать, можно использовать подстановочные знаки «?» – любой один символ или «*» – любое количество символов. В случае использования подстановочных знаков, мы можем, как копировать папку в одном экземпляре, так и сразу несколько, это позволит не использовать в программном коде циклы.
- destination – Путь к директории, в которую нужно скопировать папку.
- overwrite – Если параметр установлен в логическое значение true – будет происходить замена, false – не производить замены (по умолчанию).
И так, с теорией разобрались, теперь настало время приступить к программированию. Давайте сделаем так, я сначала приведу программный код на языке VBScript, дам пояснения к программному коду, и мы продолжим двигаться дальше.
'********************************************** ' Объект FileSystemObject методы CopyFolder и BuildPath ' Как скопировать папку на диск ' CopyFolder.vbs '********************************************** Option Explicit dim fso, new_folder, new_sub_folder, i dim WshShell, cur_dir ' формируем ссылку на объект set WshShell = CreateObject("WScript.Shell") ' текущий каталог cur_dir = WshShell.CurrentDirectory ' создаем ссылку на объект FileSystemObject set fso=CreateObject ("Scripting.FileSystemObject") ' создаем в текущей папке новый каталог set new_folder=fso.CreateFolder("Новый каталог_vbs") ' циклично сздаем 9 папок for i=1 to 9 set new_sub_folder=fso.CreateFolder(i &"_папка") ' как копировать в папку next WScript.Echo "Проверьте содержимое текущего каталога" WScript.Echo "Сейчас произойдет копирование 9 папок в каталог " & new_folder ' копируем 9 папок в другой каталог 'fso.CopyFolder cur_dir & "\?_папка", cur_dir & "\Новый каталог_vbs", true ' альтернативный вариант fso.CopyFolder cur_dir & "\?_папка", fso.BuildPath(cur_dir, "Новый каталог_vbs"), true WScript.Echo "Процесс копирования завершен" |
Теперь давайте рассмотрим, как работает данный программный код:
- Option Explicit – включаем проверку переменных
- dim fso, new_folder, new_sub_folder, i – тут мы объявили несколько переменных: fso – ссылка на объект FileSystemObject, new_folder – путь к новому каталогу, new_sub_folder – значение переменной меняется в цикл, переменная будет хранить путь к новым папкам, которые надо скопировать, i – данную переменною мы используем в цикле, она служит счетчиком.
- dim WshShell, cur_dir — объявляем две переменные, WshShell – ссылка на объект WScript.Shell, cur_dir – будет хранить полный путь к текущей папке.
Сначала создается новая папка «Новый каталог_vbs» в текущей директории, далее идет цикл for, в котором есть 9 итераций, то есть, в текущей директории будет создаваться 9 папок с шаблонным названием.
- fso.CopyFolder cur_dir & «?_папка», fso.BuildPath(cur_dir, «Новый каталог_vbs»), true – тут мы используем метод CopyFolder для копирования папок, мы задали шаблон «?_папка», то есть первый символ может быть любым, далее идёт знак подчеркивания, и слово «папка». В качестве пути, куда мы будем производить копирование папок Windows, мы указали fso.BuildPath(cur_dir, «Новый каталог_vbs»), перед этим я указал альтернативный вариант указания пути, без использования метода BuildPath.
Как скопировать в папку
Сам метод показывает, как копировать папку с заменой и без замены. Кроме того, он копирует не только сами папки, но и все файлы, которые в них находятся, то есть, нам не надо использовать метод CopyFile объекта FileSystemObject. Также стоит обратить внимание, что метод CreateFolder, который нам нужен, что бы предварительно создать директории, вернёт ошибку, если такие директории уже есть – проблема решается включением обработчика ошибок языка vbscript.
Хорошо, продолжим программировать, и теперь напишем программный код для сценария на языке jscript:
//********************************************** // Объект FileSystemObject методы CopyFolder и BuildPath // Как скопировать папку на диск // CopyFolder.js //********************************************** var fso, new_folder, new_sub_folder, i; var WshShell, cur_dir; // формируем ссылку на объект WshShell = WScript.CreateObject("WScript.Shell"); // текущий каталог cur_dir = WshShell.CurrentDirectory; // создаем ссылку на объект FileSystemObject fso=WScript.CreateObject ("Scripting.FileSystemObject"); // как копировать в папку // создаем в текущей папке новый каталог new_folder=fso.CreateFolder("Новый каталог_js"); // циклично сздаем 9 папок for (i=10; i<=19; i++){ new_sub_folder=fso.CreateFolder(i + "_папка"); } WScript.Echo ("Проверьте содержимое текущего каталога"); WScript.Echo ("Сейчас произойдет копирование 9 папок в каталог " + new_folder); // копируем 9 папок в другой каталог //fso.CopyFolder (cur_dir + "\\??_папка", cur_dir + "\\Новый каталог_js", true); fso.CopyFolder (cur_dir + "\\??_папка", fso.BuildPath(cur_dir, "Новый каталог_js"), true); WScript.Echo ("Процесс копирования завершен"); |
Данный пример альтернативен предыдущему с некоторыми изменениями, он также показывает, как скопировать папку на диск. Имена девяти новых папок будут начинаться с чисел от 10 до 19, это сделано, чтобы не создавать конфликт при создании каталогов, если вы перед этим запускали программный сценарий на языке vbscript. В конечном итоге, оба сценария будут производить копирование 9 папок в одну заданную директорию.
Стоит обратить внимание на одну особенность файловой системы Windows – общий путь не должен превышать 256 символов, начиная с корневого диска. Например, если путь к файлу вместе с его именем составляет 255 символов, а потом вы увеличите длину имени той директории, которая находится на уровень или несколько уровней выше, то уже не сможете получить доступ к конечной точке, так как общая длина будет превышать 256 символов.