в каждом подкаталоге ищутся все временные файлы с расширением tmp;
для каждого найденного временного файла производится попытка удаления. В случае успеха в Блокноте печатается путь к файлу и слово "OK", если же удаляемый файл занят, то печатается путь к файлу и слово "Busy" ("Занят");
после просмотра всех каталогов в Блокноте печатается общее количество найденных временных файлов (рис. 5.11).
Рис. 5.9. Список всех временных файлов на диске D:
Рис. 5.10.
Ошибка, возникающая при попытке удалить занятый файл
Итак, наиболее важными в сценарии являются: функция
DelFilesInFolder(Fold, SExt)
, в которой происходит попытка удаления в каталоге Fold всех файлов, имеющих расширение
SExt
, и рекурсивная (т.е. содержащая обращение к самой себе) функция
LoopSubFolders(Fold)
, в которой происходит вызов функции
DelFilesInFolder
для подкаталогов каталога Fold.
Рис. 5.11. Результат работы сценария DelTmp.js
Рассмотрим сначала функцию
DelFilesInFolder(Fold, SExt)
. Здесь сначала создается объект
Enumerator
с именем
Files
для доступа к коллекции всех файлов в каталоге Fold:
var Files, s, SPath, FileExt, Status;
Files=new Enumerator(Fold.Files);
после чего все элементы коллекции просматриваются в цикле while:
s="";
//Цикл по всем файлам
while (!Files.atEnd) {
…
Files.moveNext; //Переходим к следующему файлу
}
Для текущего файла в коллекции выделяется его расширение, которое преобразуется к верхнему регистру:
//Определяем путь к файлу
SPath=Files.item.Path;
//Выделяем расширение файла
FileExt=FSO.GetExtensionName(SPath).toUpperCase;
В случае совпадения расширения
FileExt
с расширением
SExt
в блоке
try…catch
производится попытка удаления текущего файла:
ColTmp++; //Увеличиваем счетчик файлов для удаления
try {
Status="Ok";
//Пытаемся удалить файл
Files.item.Delete;
} catch (e) {
//Обрабатываем возможные ошибки
if (е != 0) {
//Произошла ошибка при удалении файла
Status="Busy";
}
}
Таким образом, в переменной
Status
будет записан результат удаления файла: "OK" в случае успеха, и "Busy"
в том случае, если удаляемый файл занят другим приложением. После этого полный путь к удаляемому файлу и значение переменной
Status
печатаются в окне Блокнота с помощью метода
SendKeys
объекта
WshShell
. Здесь только нужно учесть, что в имени файла могут встретиться символы, имеющие специальный смысл для метода
SendKeys
, поэтому предварительно нужно соответствующим образом заменить такие символы в имени файла:
//Заменяем специальные символы в названии файла
SPath=SPath.replace("~", "{-}");
SPath=SPath.replace("+", "{+}");
SPath=SPath.replace("^", "{^}");
SPath=SPath.replace("%", "{%}");
//Посылаем название файла и результат его удаления в Блокнот
WshShell.SendKeys(SPath+"{TAB}"+Status+"~");
//Приостанавливаем сценарий на 0,5 сек
WScript.Sleep(500);
Перейдем теперь к описанию функции
LoopSubFolders(Fold)
. Сначала в этой функции удаляются временные файлы в каталоге Fold:
//Удаляем временные файлы из каталога Fold
DelFilesInFolder(Fold, ExtForDel);
Затем происходит удаление файлов во всех подкаталогах каталога Fold, причем делается это с помощью обращения для каждого подкаталога к той же функции
LoopSubFolders
:
//Создаем коллекцию подкаталогов
SubFolders = new Enumerator(Fold.SubFolders);
//Цикл по всем подкаталогам
while (!SubFolders.atEnd) {
//Вызываем рекурсивно функцию LoopSubFolders
LoopSubFolders(SubFolders.item);
//Переходим к следующему подкаталогу
SubFolders.moveNext;
}
Полный текст сценария DelTmp.js приведен в листинге 5.17.
Листинг 5.17. Удаление всех временных файлов на диске D: