Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 4 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 01.09.2005
Откуда: г. Люберцы
Необходимо на JS написать скрипт.
Задание такое:
Найти 10 файлов с наибольшим размером в указанной папке и её подпапках.
Соответственно вывести их на экран. Путь к папке дожен передаваться через параметры.

Сделано:
Реализовал функцию + алгоритм сортировки и вывода на экран.

Косяки:
Почему-то в массив пишутся только файлы из папки, без файлов их подпапок (косяк функции).
Необходимо реализовать передачу пути к папке в функцию( на стадии тестирования).

Сам скрипт (по умолчанию стоит путь А:\ ):
Код:
var k = 0, n, arg, all, all2;
all = new Array();
all2= new Array();
arg = WScript.Arguments;
FSO = WScript.CreateObject("Scripting.FileSystemObject");

function ShowFolder(fso, FolderName,a, mas){
   var fld, en, aaa,s;
   mas = new Array();
   //WScript.Echo(FolderName);

   try {
         fld = fso.GetFolder(FolderName);
   }
   catch(e) {
         WScript.Echo(e);
         return;
      }
   en = new Enumerator(fld.SubFolders);
   for (; !en.atEnd(); en.moveNext()) {
         CurrentFolder = en.item();
      ShowFolder(fso, FolderName + "\\" + CurrentFolder.Name, s , mas);
      
   }
   en = new Enumerator(fld.Files);
   for (; !en.atEnd(); en.moveNext()) {
         FileName = en.item().Name;
      aaa =en.item();
      mas[a] = aaa;
      a++;
      s = mas.length;
      //WScript.Echo(aaa);
      //WScript.Echo(FolderName + "\\" + FileName);
   }
return mas;
}
all = ShowFolder(FSO, "A:",k,all2);
n=all.length;
//WScript.Echo(n);
size = new Array();
pth = new Array();
tmp = Array (n);
for (i = 0; i < n; i++){
   //WScript.Echo (all[i]);
     }
for (i = 0; i < n; i++)
{   
   if (all[i] != null)
   {
      size[i] = all[i].Size;
   
      pth[i] = all[i].Path;
   }
}
for (i = 0; i < n; i++)
   tmp[i] = i;      
for (i = 0; i < n; i++){
   //WScript.Echo (size[i]);
   //WScript.Echo (pth[i]);   
}      
for (i = 0; i < n - 1; i++)
{
   for (j = i + 1; j < n; j++)
       {
              if (size[j] > size[i])
             {
                a = tmp[i];
         tmp[i] = tmp[j];
         tmp[j] = a;
         
         temp = size[i];
         size[i]=size[j];
         size[j] = temp;   
             }
      }
}
for (i = 0; i < 10; i++)
   WScript.Echo((i +1) + ". Size  " + size[i]/1024 + " kb  \n Path: " + pth[tmp[i]]);

_________________
Overclocking FOREVER!



Партнер
 

Junior
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: г. Новокузнецк
Замечание номер раз. На кой ты поместил создание массива внутрь рекурсивной функции?

Замечание номер два Можно было вообще не заморачиваться насчет передачи длины массива через параметр функции.

Посему предлагаю юзать исправленный вариант функции:

Код:
function ShowFolder(fso, FolderName, mas){
   var fld, en;
   try {
         fld = fso.GetFolder(FolderName);
   }
   catch(e) {
         document.write(e);
         return;
      }

   en = new Enumerator(fld.SubFolders);
   for (; !en.atEnd(); en.moveNext()) {
      CurrentFolder = en.item();
      ShowFolder(fso, FolderName + "\\" + CurrentFolder.Name, mas);
   }
   
   en = new Enumerator(fld.Files);
   for (; !en.atEnd(); en.moveNext()) {
         mas.push(en.item());
   }
return mas;


 

Member
Статус: Не в сети
Регистрация: 01.09.2005
Откуда: г. Люберцы
Owl83 писал(а):
Замечание номер раз. На кой ты поместил создание массива внутрь рекурсивной функции?

Замечание номер два Можно было вообще не заморачиваться насчет передачи длины массива через параметр функции.



Спасибо большое за помощь! :beer:
Только вот с этим он ни как не хотел работать:
Код:
catch(e)
{
         document.write(e);
         return;
}

Говорит не знает что такое "document" :)

Вот финальный вариант скрипта, кому нужен юзайте :) :
Код:
ARGUM = WScript.Arguments;
var i = 0;
function FindAll(fso, FolderName, All)
{
   var fld, en;
      try
   {
      fld = fso.GetFolder(FolderName);
      }
      catch(e)
   {
      WScript.Echo(e);
      return;
      }
      en = new Enumerator(fld.SubFolders);
      for (; !en.atEnd(); en.moveNext())
   {
            CurrentFolder = en.item();
            FindAll(fso, FolderName + "\" + CurrentFolder.Name, All);
     }
          en = new Enumerator(fld.Files);
      for (; !en.atEnd(); en.moveNext())
   {
            All.push(en.item());
      }
   return All;
}

All = new Array;
FSO = FSO = WScript.CreateObject("Scripting.FileSystemObject");
FindAll(FSO, ARGUM.item(0), All);
L = All.length;
mas = new Array();
pth = new Array();
tmp = Array (L);

for (i = 0; i < L; i++)
{   
   if (All[i] != null)
   {

      mas[i] = All[i].Size;
   
      pth[i] = All[i].Path;
   }
}

for (i = 0; i < L; i++)
{
   tmp[i] = i;   
}

for (i = 0; i < L - 1; i++)
{
   for (j = i + 1; j < L; j++)
       {
           if (mas[j] > mas[i])
             {
                a = tmp[i];
         tmp[i] = tmp[j];
         tmp[j] = a;
         
         temp = mas[i];
         mas[i]=mas[j];
         mas[j] = temp;   
             }
      }
}

for (i = 0; i < 10; i++)
   WScript.Echo((i +1) + ". Size  " + mas[i]/1024 + " kb  \n Path: " + pth[tmp[i]]);

_________________
Overclocking FOREVER!


 

Junior
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: г. Новокузнецк
Zlobnui
Да не за что :)

А document - это от отладки осталось. Пардон эмуа


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 4 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan