Перемещение файлов с ведением журнала действий

Перемещение файлов с ведением журнала действий

Поставим перед собой следующую задачу. Пусть в заданный каталог на жестком диске (например, C:In) поступают из почтовой программы или по локальной сети файлы с различными расширениями. Требуется выделить из них все файлы с заданным расширением (например, 003) и перенести их в другой каталог (например, C:Out). При этом необходимо вести журнал операций (log-файл), в который для каждого переносимого файла записывать следующую информацию: имя файла, дату и время его создания, дату и время перемещения файла. Структура log-файла (в нашем случае это файл C:Inlog.txt) должна быть следующей:

Имя файла (Дата и время создания) Дата и время перемещения

Например:

34556.003    (19/10/2002 10:45) 19/10/2002 11:02

43432_KL.003 (19/10/2002 10:45) 19/10/2002 11:02

45.003       (19/10/2002 10:45) 19/10/2002 11:02

              ...

Кроме этого, во время перемещения файлов на экран должна выводиться информация о том, какой именно файл обрабатывается, а после завершения работы сценария нужно напечатать общее количество перемещенных файлов (рис. 5.13).

Рис. 5.13. Информация о перемещении файлов

Поставленную задачу выполняет рассматриваемый ниже сценарий MoveLog.js; запускать этот сценарий следует в консольном режиме с помощью cscript.exe.

Пути к каталогу-источнику, в котором первоначально находятся файлы, и к целевому каталогу, в который будут перемещены эти файлы, хранятся соответственно в переменных Source и Dest:

var

 Source="C:\In\", //Путь к каталогу-источнику файлов для перемещения

 Dest="C:\Out\"; //Путь к целевому каталогу

В переменных Mask и PathLog записаны соответственно расширение файлов для перемещения и путь к log-файлу:

var

 Mask="003", //Расширение файлов для перемещения

 PathLog="C:\In\log.txt"; //Путь к log-файлу

Сначала в сценарии с помощью метода FolderExists объекта FileSystemObject проверяется наличие на диске каталога-источника; в случае отсутствия этого каталога выводится соответствующее сообщение и выполнение сценария прерывается:

//Создаем объект FileSystemObject

FSO=WScript.CreateObject("Scripting.FileSystemObject");

//Проверяем наличие каталога-источника

if (!FSO.FolderExists(Source)) {

 //Выводим сообщение об отсутствии каталога-источника

 WScript.Echo("Каталог-источник", Source, "не существует.");

 WScript.Echo("Нажмите Enter...");

 WScript.StdIn.ReadLine();

 //Выходим из сценария

 WScript.Quit();

}

Аналогичным образом проверяется наличие целевого каталога:

//Проверяем наличие целевого каталога

if (!FSO.FolderExists(Dest)) {

 //Выводим сообщение об отсутствии целевого каталога

 WScript.Echo("Целевой каталог", Dest, "не существует.");

 WScript.StdIn.ReadLine();

 WScript.StdIn.ReadLine();

 //Выходим из сценария

 WScript.Quit();

}

После этого создается объект Enumerator (переменная Files) для доступа к коллекции всех файлов в каталоге-источнике:

//Создаем объект Folder для каталога-источника Fold=FSO.GetFolder(Source);

//Создаем объект Enumerator для доступа к коллекции файлов

//в каталоге-источнике

Files=new Enumerator(Fold.Files);

Операции записи информации в log-файл и непосредственно переноса файлов из одного каталога в другой реализованы соответственно в функциях WriteLog() и MoveFiles().

В функции WriteLog() после объявления переменных открывается log-файл в режиме добавления строк:

var s, ss, s1, d, File, FLog;

WScript.Echo(" ");

WScript.Echo("Записываем информацию в log-файл...");

//Открываем log-файл для добавления

FLog=FSO.OpenTextFile(PathLog, ForAppending, true);

Затем в цикле while происходит просмотр коллекции файлов в каталоге-источнике:

//Переходим к первому элементу коллекции файлов

Files.moveFirst();

//Цикл по всем файлам в коллекции

while (!Files.atEnd()) {

 //Извлекаем текущий файл из коллекции

 File=Files.item();

 //Переходим к следующему файлу в коллекции

 Files.moveNext();

}

Если файл подлежит перемещению (расширение этого файла совпадает с расширением файлов для перемещения), то определяется его имя (свойство Name), дата создания (свойство DateCreated) и текущая дата (объект Date), и в log-файл записывается соответствующая информация:

//Выделяем расширение файла

s=FSO.GetExtensionName(File.Name);

//Проверяем, совпадает ли расширение текущего файла

//с расширением файлов для перемещения

if (s==Mask) {

 //Выводим имя файла на экран

 WScript.Echo("  "+File.Name);

 //Определяем дату создания файла

 d=new Date(File.DateCreated);

 //Формируем строку ss для записи в log-файл

 ss=LFillStr(13,File.Name)

 s1="("+DateToStr(d)+" ";

 s1+=TimeToStr(d)+")";

 ss+=LFillStr(20,s1);

 //Определяем текущую дату

 d=new Date();

 ss+=DateToStr(d);

 ss+=" "+TimeToStr(d);

 //Записываем сформированную строку в log-файл

 FLog.WriteLine(ss);

}

Записываемая в log-файл строка формируется в нужном виде с помощью вспомогательных функций LFillStr (выравнивание строки влево в поле заданной длины), DateToStr (формирование из объекта Date строки формата ДД/ММ/ГГГГ) и TimeTostr (формирование из объекта Date строки формата ЧЧ:ММ).

В функции MoveFiles(), как и в WriteLog(), производится перебор в цикле while файлов каталога-источника (элементов коллекции Files). Перемещение файлов осуществляется с помощью последовательного применения методов Copy и Delete:

Files.moveFirst();

//Цикл по всем файлам в коллекции

while (!Files.atEnd()) {

 //Извлекаем текущий файл из коллекции

 File=Files.item();

 //Выделяем расширение файла

 s=FSO.GetExtensionName(File.Name);

 //Проверяем, совпадает ли расширение текущего файла

 //с расширением файлов для перемещения

 if (s==Mask) {

  //Выводим имя файла на экран

  WScript.Echo("  "+File.name);

  //Копируем файл в целевой каталог

  File.Copy(Dest);

  //Удаляем файл

  File.Delete();

  //Увеличиваем счетчик количества перемещенных файлов

  Col++;

 }

 //Переходим к следующему файлу в коллекции

 Files.moveNext();

}

После перемещения всех файлов на экран выводится информация об их количестве:

WScript.Echo("Перемещено файлов:", Col);

WScript.Echo("Нажмите Enter...");

WScript.StdIn.ReadLine();

Полный текст сценария MoveLog.js приведен в листинге 5.19.

Листинг 5.19. Поиск файлов с ведением log-файла

/*******************************************************************/

/* Имя: MoveLog.js                                                 */

/* Язык: JScript                                                   */

/* Описание: Перемещение файлов из каталога-источника в            */

/*           целевой каталог с ведением log-файла                  */

/*******************************************************************/

//Объявляем переменные

var

 Source="C:\In\", //Путь к каталогу-источнику файлов для перемещения

 Dest="C:\Out\",  //Путь к целевому каталогу

 Mask="003",        //Расширение файлов для перемещения

 PathLog="C:\In\log.txt",   //Путь к log-файлу

 ForAppending=8;    //Константа для работы с файлами

//Объявляем переменные

var FSO,Fold,Files;

//Функция для записи информации в log-файл

function WriteLog() {

//Объявляем переменные

var s,ss,s1,d,File,FLog;

 WScript.Echo("");

 WScript.Echo("Записываем информацию в log-файл...");

 //Открываем log-файл для добавления

 FLog=FSO.OpenTextFile(PathLog,ForAppending,true);

 //Переходим к первому элементу коллекции файлов

 Files.moveFirst();

 //Цикл по всем файлам в коллекции

 while (!Files.atEnd()) {

  //Извлекаем текущий файл из коллекции

  File=Files.item();

  //Выделяем расширение файла

  s=FSO.GetExtensionName(File.Name);

  //Проверяем, совпадает ли расширение текущего файла

  //с расширением файлов для перемещения

  if (s==Mask) {

   //Выводим имя файла на экран

   WScript.Echo("  "+File.Name);

   //Определяем дату создания файла

   d=new Date(File.DateCreated);

   //Формируем строку ss для записи в log-файл

   ss=LFillStr(13,File.Name)

   s1="("+DateToStr(d)+" ";

   s1+=TimeToStr(d)+")";

   ss+=LFillStr(20,s1);

   //Определяем текущую дату

   d=new Date();

   ss+=DateToStr(d);

   ss+=" "+TimeToStr(d);

   //Записываем сформированную строку в log-файл

   FLog.WriteLine(ss);

  }

  //Переходим к следующему файлу в коллекции

  Files.moveNext();

 }

}

//Функция для перемещения файлов

function MoveFiles() {

 //Объявляем переменные

 var s,ss,Col,File;

 Col=0; //Счетчик количества перемещенных файлов

 WScript.Echo("");

 WScript.Echo("Перемещаем файлы ...");

 //Переходим к первому элементу коллекции файлов

 Files.moveFirst();

 //Цикл по всем файлам в коллекции

 while (!Files.atEnd()) {

  //Извлекаем текущий файл из коллекции

  File=Files.item();

  //Выделяем расширение файла

  s=FSO.GetExtensionName(File.Name);

  //Проверяем, совпадает ли расширение текущего файла

  //с расширением файлов для перемещения

  if (s==Mask) {

   //Выводим имя файла на экран

   WScript.Echo("  "+File.name);

   //Копируем файл в целевой каталог

   File.Copy(Dest);

   //Удаляем файл

   File.Delete();

   //Увеличиваем счетчик количества перемещенных файлов

   Col++;

  }

  //Переходим к следующему файлу в коллекции

  Files.moveNext();

 }

 //Выводим информацию о количестве перемещенных файлов

 WScript.Echo("");

 WScript.Echo("Перемещено файлов:",Col);

 WScript.Echo("Нажмите Enter...");

 WScript.StdIn.ReadLine();

}

/*******************  Начало  **********************************/

//Создаем объект FileSystemObject

FSO=WScript.CreateObject("Scripting.FileSystemObject");

//Проверяем наличие каталога-источника

if (!FSO.FolderExists(Source)) {

 //Выводим сообщение об отсутствии каталога-источника

 WScript.Echo("Каталог-источник",Source,"не существует.");

 WScript.Echo("Нажмите Enter...");

 WScript.StdIn.ReadLine();

 //Выходим из сценария

 WScript.Quit();

}

//Проверяем наличие целевого каталога

if (!FSO.FolderExists(Dest)) {

 //Выводим сообщение об отсутствии целевого каталога

 WScript.Echo("Целевой каталог",Dest,"не существует.");

 WScript.StdIn.ReadLine();

 WScript.StdIn.ReadLine();

 //Выходим из сценария

 WScript.Quit();

}

//Создаем объект Folder для каталога-источника

Fold=FSO.GetFolder(Source);

//Создаем объект Enumerator для доступа к коллекцию файлов

//в каталоге-источнике

Files=new Enumerator(Fold.Files);

//Записываем информацию в log-файл

WriteLog();

//Перемещаем файлы в целевой каталог

MoveFiles();

/*************  Конец *********************************************/

// Вспомогательные функции 

//Дополнение строки ss ведущими нулями до длины ll

function LeadZero(ll,ss) {

 var i,s,l1;

 s=ss.toString();

 l1=s.length;

 if (l1<=ll) {

  for (i=1;i<=ll-l1;i++) s="0"+s;

 }

 return(s);

}

//Формирование из объекта Date строки формата ДД/ММ/ГГГГ

function DateToStr(dd) {

 var s;

 s=LeadZero(2,dd.getDate())+"/";

 s+=LeadZero(2,dd.getMonth()+1)+"/";

 s+=dd.getYear();

 return(s);

}

//Формирование из объекта Date строки формата ЧЧ:ММ

function TimeToStr(dd) {

 var s;

 s=LeadZero(2,dd.getHours())+":"+LeadZero(2,dd.getMinutes());

 return(s);

}

//Выравнивание строки s влево в поле длиной l символов

function LFillStr(l,s) {

 var ss,i,ll;

 ll=l-s.length;

 if (s.length>=l) {

  return(s);

 } else {

  ss=s;

  for (i=1;i<=ll;i++) {

   ss=ss+" ";

  }

  return(ss);

 }

}

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

8.4. Перемещение по иерархии файлов

Из книги автора

8.4. Перемещение по иерархии файлов Несколько системных вызовов и стандартных библиотечных функций дают возможность изменять текущий каталог и определять полный путь к текущему каталогу. Более сложные функции позволяют осуществлять произвольные действия с каждым


Окно журнала

Из книги автора

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


История «Живого журнала». Что можно делать в ЖЖ

Из книги автора

История «Живого журнала». Что можно делать в ЖЖ 18 марта 1999 года американец Брэд Фицпатрик оставил первую запись тестового характера на livejournal.com. Целью создания такого сервиса было представление информации о себе своим друзьям. Впоследствии доступ к сервису был открыт и


Как посетить сайт, чтобы об этом никто не знал (чистка кэша, журнала, Cookies)

Из книги автора

Как посетить сайт, чтобы об этом никто не знал (чистка кэша, журнала, Cookies) Локально следы ваших посещений фиксируются интернет-обозревателем и записываются в журнал. Помимо журнальных записей, историю можно воспроизвести, просмотрев содержание папки Temporary Internet Files и Cookies.


4.2.3. Журналируемая файловая система. Параметры журнала

Из книги автора

4.2.3. Журналируемая файловая система. Параметры журнала Файловая система Linux является журналируемой. Сейчас по-ясню, что это такое. Перед выполнением каких-либо операций файловая система создает "план действий", который помешается в так называемый "журнал". Затем она


12.2 Копирование, перемещение и удаление файлов

Из книги автора

12.2 Копирование, перемещение и удаление файлов Хоть я и обещал не объяснять основы использования компьютера, позволю вам напомнить несколько полезных сочетаний клавиш, используемых для управления файлами и папками:• Ctrl—C — копировать выделенные объекты в буфер


Перемещение HOST, LMHOST и других файлов из WindowsSystem32driversetc в другое место

Из книги автора

Перемещение HOST, LMHOST и других файлов из WindowsSystem32driversetc в другое место Если вы хотите указанные файлы в другое место (например, по соображениям безопасности) из папки WindowsSystem32driversetc, то: 1. Скопируйте файлы в новое место2. Зайдите в раздел HKLMSYSTEMCurrentControlSetServicesTcpipParameters3. Измените


Строение журнала

Из книги автора

Строение журнала Строение конкретного журнала может быть довольно сложным, если учитывать тематические разделы и их размещение в журнале. Однако в конечном итоге основными элементами любого журнала будут обложка, оглавление и внутренние полосы.Строение обложки


Пример 12-4. Использование команды xargs для мониторинга системного журнала

Из книги автора

Пример 12-4. Использование команды xargs для мониторинга системного журнала #!/bin/bash# Создание временного файла мониторинга в текщем каталоге,# куда переписываются несколько последних строк из /var/log/messages.# Обратите внимание: если сценарий запускается обычным пользователем,# то


Совместный проект Google и журнала Time покажет, как изменилась планета за последние 25 лет Николай Маслухин

Из книги автора

Совместный проект Google и журнала Time покажет, как изменилась планета за последние 25 лет Николай Маслухин Опубликовано 13 мая 2013 Более четверти века поверхность Земли фотографируют спутники из космоса. Миллионы скопившихся снимков постоянно


17.13. Модель с обложки журнала

Из книги автора

17.13. Модель с обложки журнала То, насколько хорошо фотомодель получается на снимках, во многом зависит не только от ее внешних данных, но и от умения фотографа найти общий язык с ней. Если модель чувствует себя раскованно, то снимки получаются естественными. Однако какими


Создание, копирование и перемещение файлов и каталогов

Из книги автора

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


Перемещение и копирование файлов и папок

Из книги автора

Перемещение и копирование файлов и папок В результате копирования файла будет создан еще один его экземпляр, но в другом месте или с другим именем. При перемещении файл будет скопирован в новое место, а затем удален со старого.Для перемещения или копирования файлов и


Просмотр ранее посещенных страниц с помощью Журнала

Из книги автора

Просмотр ранее посещенных страниц с помощью Журнала Чтобы вернуться к одной из страниц, посещенных ранее, откройте Центр управления избранным и перейдите на вкладку Журнал. Для поиска нужного сайта сначала следует щелкнуть кнопкой мыши на названии дня или недели, после


Спецвыпуск журнала Forbes со встроенной Wi-Fi точкой доступа Николай Маслухин

Из книги автора

Спецвыпуск журнала Forbes со встроенной Wi-Fi точкой доступа Николай Маслухин Опубликовано 26 апреля 2013Один из самых авторитетных и известных экономических изданий мира — журнал Forbes выпустил ограниченную серию номера с необычной вкладкой: мобильным Wi-Fi роутером. Этот