Vbs удалить папку с файлами
Предположим, что ежедневно во временную папку поступают файлы отчетов от филиалов. Они могут собираться из почты кодом вроде такого: Сохранить вложения из Outlook в указанную папку или добавляться в папку иными средствами. Далее Вы собираете данные из этих файлов неким кодом(вроде этого - Как собрать данные с нескольких листов или книг?). Но с каждым днем файлов все больше и больше и приходится заходить в папку и руками чистить её от лишних файлов, чтобы при сборе данных не приходилось каждый раз искать и отбирать только новые файлы.
Если надо удалять только конкретные файлы(например только файлы Excel, содержащие в имени слово "отчет"), то можно использовать такой код:
Чтобы удалять полностью все файлы в папке(а не только файлы Excel), а саму папку оставить, то строку sFiles = Dir(sFolder & "*отчет*.xls*") надо записать так: sFiles = Dir(sFolder & "*")
Если необходимо удалять файлы по дате создания/изменения(например, только файлы, созданные раньше 01.03.2017), то можно использовать такой код:
Если необходимо всегда удалять файлы, дата создания которых раньше текущей, то строку dKill = CDate("01.03.2017") нужно заменить на такую: dKill = Date . Если удалить надо файлы недельной давности, то: dKill = Date-7
Если же необходимо удалить папку полностью, а не только файлы в ней, то лучше использовать такой код:
Sub RemoveFolderWithContent() Dim sFolder As String, sFiles As String 'диалог запроса выбора папки на удаление With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub sFolder = .SelectedItems(1) End With sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator) 'путь к папке можно задать статично, если он заранее известен и не изменяется ' sFolder = "C:\temp\Ежедневные отчеты\10072017" 'путь к папке, которую надо удалить Shell "cmd /c rd /S/Q """ & sFolder & """" End Sub
Этот код удалить папку вместе со всеми файлами буквально за секунду.
Вообще в VBA есть специальная команда для удаления директорий(папок) RmDir . Но она способна удалить только пустую папку, поэтому редко когда можно найти её практическое применение. Если в файле есть хоть один файл то команда RmDir выдаст ошибку '75' - File/Path access error .
Как мы уже говорили, В VBS для работы с файловой системой существует FileSystemObject.
При помощи FSO можно работать с папками. Алгоритм начала работы такой:
1. Объявляем переменную. Не обязательно такое же название, но оно наиболее логичное. А ещё, ваш код будет понятнее для других.
Dim FSO
2. Записываем в переменную FSO копию объекта FileSystemObject, который предназначен для работы с файловой системой Windows
3. Получаем доступ к папке в переменной fold
А теперь давайте посмотрим, что мы можем сделать с папками?
А так же непосредственно с FSO:
Коллекция SubFolders
Set subfold = f.SubFolders
Теперь мы получили доступ к подкаталогам выбранного каталога в переменную subfold. Давайте взглянем на простой пример использования коллекции SubFolders:
Давайте разберёмся поподробнее. Итак, вводим путь в переменную 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. Хотел бы её заранее объяснить, чтобы не возникло вопросов.
Path = objTree.Self.Path
Name = objTree.Self.name
Работа конструкции такова: Создаётся копия объекта в переменную oShell. Далее при помощи метода BrowseFolFolder вызывается окно поиска папки. Первое значение 0 должно быть нулём, далее идёт текст. Далее метод, по которому будет выполнятся отображение, и путь, от которого будет идти поиск. Выше этого пути выйти будет нельзя.
Приведём список методов отображения:
Путь может быть задан и численно. Вот список возможных значений:
DESKTOP = 0
PROGRAMS = 2
DRIVES = 17
NETWORK = 18
NETHOOD = 19
PROGRAMFILES = 38
PROGRAMFILESx86 = 48
WINDOWS = 36
Итак, теперь задачи.
ЗАДАЧА 1 : Компьютер на любом из существующем локальном диске компьютера ищет произвольную папку и выстраивает произвольной длинны папку. После чего, выдаёт всю информацию по данной папке.
Код довольно большой, поэтому разобьём его на несколько блоков:
Итак, создаём объект FSO, запускаем генератор случайных чисел. Далее расписываем функции(далее на каждой остановимся). Нам нужно сделать 3 разные вещи: Выбрать локальный диск компьютера(первая функция, строки 5-14), Раскрыть каталог и выбрать там ещё каталог(вторая функция, 16-32) и Вывести информацию по каталогу(третья функция, 34-42). Прежде чем мы вернёмся к основному коду давайте рассмотрим работу функций и поймём, как они устроены у нас.
Итак, выбор локального диска на компьютере:
Теперь, вернёмся к основному коду:
Ну и в самом конце мы выводим получившийся путь Path и выводим значение функции FoldInf по полученному пути Path.
Объектная модель FileSystemObject (FSO) позволяет вам работать программно с дисками и файлами так же, как вы это делаете в Проводнике Windows интерактивно. Вы можете копировать и перемещать папки, получать информацию о дисках и папках и т.п.
Получение информации о дисках
- Общий объём диска в байтах (свойство TotalSize)
- Объём свободного места на диске в байтах (свойства AvailableSpace или FreeSpace)
- Какая буква назначена диску (свойство DriveLetter)
- Тип диска: съёмный, не съёмный, сетевой, CD-ROM или RAM-диск (свойство DriveType)
- Серийный номер диска (свойство SerialNumber)
- Тип файловой системы: FAT, FAT32, NTFS или др. (свойство FileSystem)
- Доступность диска в текущий момент (свойство IsReady)
- Сетевое имя или метка тома (свойства ShareName и VolumeName)
- Путь к корневой директории диска (свойства Path и RootFolder)
Пример использования объекта Drive
Используйте объект Drive для получения информации о диске. Вы не увидите ссылку на актуальный объект Drive в следующем коде. Вместо этого используется метод GetDrive для получения ссылки на существующий объект Drive (в нашем примере это переменная drv).
Следующий пример демонстрирует использование объекта Drive в VBScript:
Работа с папками
Общие задачи по работе с папками и методы для их выполнения описаны ниже в таблице:
Задача | Метод |
Создание папки | FileSystemObject.CreateFolder |
Удаление папки | Folder.Delete или FileSystemObject.DeleteFolder |
Перемещение папки | Folder.Move или FileSystemObject.MoveFolder |
Копирование папки | Folder.Copy или FileSystemObject.CopyFolder |
Получение имени папки | Folder.Name |
Узнать, существует ли папка на диске | FileSystemObject.FolderExists |
Получить экземпляр существующего объекта Folder | FileSystemObject.GetFolder |
Получить имя родительской папки | FileSystemObject.GetParentFolderName |
Получить путь системных папок | FileSystemObject.GetSpecialFolder |
Пример использования данного объекта см. в разделе «3.7. Пример работы с объектом FileSystemObject».
В следующем примере показано использование объектов Folder и FileSystemObject, где выполняется управление папками и получение информации о них:
Читайте также: