Vbs удалить папку с файлами

Обновлено: 08.07.2024

Предположим, что ежедневно во временную папку поступают файлы отчетов от филиалов. Они могут собираться из почты кодом вроде такого: Сохранить вложения из 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:

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 : Компьютер на любом из существующем локальном диске компьютера ищет произвольную папку и выстраивает произвольной длинны папку. После чего, выдаёт всю информацию по данной папке.

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

Folder zadacha

Итак, создаём объект 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, где выполняется управление папками и получение информации о них:

Читайте также: