Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на JavaScript

  Все выпуски  

Азы и секреты программирования на JavaScript.


Служба Рассылок Subscribe.Ru проекта Citycat.Ru
Азы и секреты программирования на JavaScript Выпуск 9

Ссылка на архив предыдущих выпусков: http://www.b-soft.ru/prof/index.shtml
Статистика рассылки: http://subscribe.ru/stat/comp.soft.prog.javascript/

Один из подписчиков нашей рассылки обратился ко мне на е-майл с просьбой. Не буду приводить полностью текст его письма - передам только смысл. Он писал, что, блуждая по сети, вступил в случайную связь и подхватил вирусную инфекцию (при случайных связях не забывайте о средствах предохранения! :-) ). В итоге, его "железный друг" заболел. Вирус поражает HTM(L) файлы, дописывая в них код, который мешает нормальной работе. В общем, просьба звучала так:

"Можно ли на Яве написать скрипт, который бы искал файлы типа htm(L), открывал их, искал определённый текст и удалял его?! ОЧЕНЬ прошу - помогите ..."

Этой теме мы и посвятим текущий выпуск рассылки. Спасибо за то, что подали интересную идею.

Сама идея поиска определенных файлов в текстовом формате, и исправление в них отдельных участков текста весьма актуальна, особенно для тех, кто пишет программы. Для этих целей серьезные компании пишут специальные утилиты, затрачивая массу времени и средств. Я же обещаю Вам получить аналогичую полноценную "утилиту", написав чуть больше 50 строк в текстовом формате.

Очевидно, что наша задачка вполне естественно распадается на 3 основные части:

  1. Получение списка всех папок и подпапок в текущем дереве каталогов.
  2. Получение списка всех файлов в каждой из папок.
  3. Проверка содержимого каждого из файлов нужного нам типа, и его коррекция.

Начнем с "конца". Для поиска подстроки в строковой переменной используется метод search(string), а для замены одной подстроки на другую - функция replace("finding text", "replacing text"). Предположим, что у нас имеется какой-то текст полученный из файла: FileString, в котором необходимо найти какой-то текстовый блок FindingText, и заменить его на текст ReplacingText. Тогда код поиска и замены будет выглядеть так:

var FindingText="текст, который будем искать"; var ReplacingText=""; // найденный текст просто удалим if(FileString.search(FindingText)>0) { FileString = FileString.replace(FindingText, ReplacingText); }

Теперь посмотрим, как получить нужный текст из файла, и записать модифицированный. Для этого нам понадобится метод object.OpenAsTextStream([iomode, [format]]) объекта File:

function FileModyfy(currentFile) { // Читаем файл FileHeader = currentFile.OpenAsTextStream(ForReading, TristateUseDefault); FileString = FileHeader.ReadAll(); // получение текста из файла FileHeader.Close( ); // текст получен - файл можно закрыть // ищем строку FindingText if(FileString.search(FindingText)>0){ // заменяем текст FileString = FileString.replace( FindingText, ""); FileHeader = currentFile.OpenAsTextStream(ForWriting, TristateUseDefault); FileHeader.Write(FileString); FileHeader.Close( ); }; }

На этом первый (точнее последний по порядку) этап можно считать решенным. 

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

function SearchFiles(folderspec) { var f, fc, s; f = fso.GetFolder(folderspec); fc = new Enumerator(f.files); s = ""; for (; !fc.atEnd(); fc.moveNext()) { s = fc.item(); CurrentType=FileType(s); if(CurrentType.search(SearchingType)>0){ FileModyfy(s); } } } // получение типа файла function FileType(filespec) { var f, s; if (fso.FolderExists(filespec)) f = fso.GetFolder(filespec); else if (fso.FileExists(filespec)) f = fso.GetFile(filespec); else s = "Error: File or Folder does not find."; s = f.Type; return(s); }

В приведенном выше коде обратите внимание на функцию FileType(s). Она возвращает переменную строкового типа, имеющую вид "Netscape Hypertext document", если у Вас установлен Netscape Navigator, или "Документ HTML" - если MS Internet Explorer. Так как по расширению файл искать не имеет смысла - расширений может быть несколько (HTM, HTML и т.п.) В полученной переменной ищем ключевое слово Hypertext, или HTML, которое говорит о том, что найденый файл - гипертекстовый документ. Если тип файла удовлетворяет нужным условиям - передаем его для модификации.

Вот почти и все! Осталось организовать перебор подкаталогов в рабочем каталоге, от которого начнем поиск. Для этого напишем функцию получения списка подкаталогов, которая будет рекурсивно (хорошая вещь JScript!) обращаться сама к себе для каждого найденного подкаталога, и в нем дальше искать подкаталоги до самого нижнего уровня. Все найденные подкаталоги будем передавать в уже написанную функцию просмотра и модификации файлов. Вот теперь действительно все. В полном виде наша программа будет выглядеть так:

var folderspec="C:\\temp"; // стартовый каталог // var SearchingType="Hypertext"; // тип файлов для Netscape var SearchingType="HTML"; // тип файлов для MS IE var FindingText = "этот текст надо удалить"; // искомый блок текста var WSHShell = WScript.CreateObject("WScript.Shell"); var ForReading = 1, ForWriting = 2, ForAppending = 8; var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0; var fso = new ActiveXObject("Scripting.FileSystemObject"); CurrentFolder = folderspec; ScanFolders(CurrentFolder); WSHShell.Popup("It's done."); // получение списка каталогов function ScanFolders(folderspec) { var f, fc; SearchFiles(folderspec); f = fso.GetFolder(folderspec); fc = new Enumerator(f.SubFolders); for (; !fc.atEnd(); fc.moveNext()) { CurrentFolder = fc.item(); ScanFolders(CurrentFolder); } } // Получение списка файлов в каталоге function SearchFiles(folderspec) { var f, fc, s; f = fso.GetFolder(folderspec); fc = new Enumerator(f.files); s = ""; for (; !fc.atEnd(); fc.moveNext()) { s = fc.item(); CurrentType=FileType(s); // WSHShell.Popup(CurrentType); // если Вы не знаете, //как на Вашем компьютере обозначается // тип гипертекстовых файлов - снимите // обозначение комментария // и Вы увидите как это выглядит. if(CurrentType.search(SearchingType)>0){ FileModyfy(s); } } } // получение типа файла function FileType(filespec) { var f, s; if (fso.FolderExists(filespec)) f = fso.GetFolder(filespec); else if (fso.FileExists(filespec)) f = fso.GetFile(filespec); else s = "Error: File or Folder does not find."; s = f.Type; return(s); } // удаление искомой строки function FileModyfy(currentFile) { // Читаем файл FileHeader = currentFile.OpenAsTextStream(ForReading, TristateUseDefault); FileString = FileHeader.ReadAll(); FileHeader.Close( ); // ищем строку FindingText if(FileString.search(FindingText)>0){ // заменяем текст FileString = FileString.replace( FindingText, ""); FileHeader = currentFile.OpenAsTextStream(ForWriting, TristateUseDefault); FileHeader.Write(FileString); FileHeader.Close( ); }; }

Приведенный код надо сохранить в текстовом файле. Присвоить ему расширение .js, и можно запускать на выполнение, как обычный исполняемый файл. Если У Вас ОС Windows 95, и не установлен сервер сценариев для JavaScript, Вы можете скачать его с http://www.microsoft.com/scripting/. Впрочем, и пользователям W'98 - W'2000 тоже полезно туда сходить, и качнуть свежую версию.

На этом тему файловой системы мы закрываем. Все объекты, их методы и свойства, относящиеся к работе с файловой системой Вы можете найти в базе данных на моем сайте по адресу: http://www.b-soft.ru/scripting/index.php. Правда там часть материала еще не переведена на русский язык, но с минимальным знанием технического английского с ним вполне можно работать. А перевод будет закончен в самое ближайшее время.


Ссылка на архив предыдущих выпусков: http://www.b-soft.ru/prof/index.shtml
Статистика рассылки: http://subscribe.ru/stat/comp.soft.prog.javascript/

Автор и ведущий рассылки Игорь Балезин
Возможно-ли зарабатывать в Интернет?


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное