Шаг 59.
Основы JavaScript.
Работа с дисками

    На этом шаге мы рассмотрим работу с дисками.

    Работа с дисками заключается в получении информации о них (объем свободного пространства, тип, готовность и т. п.). Невозможно создать или удалить диск. Информация о дисках важна, например, при создании папок и файлов. При создании, копировании или перемещении файла полезно сначала убедиться, что указанный вами диск существует, готов к работе и имеет достаточно свободного пространства. Знание серийного номера диска может использоваться, например, при решении задачи защиты программных продуктов от несанкционированного копирования.

    При создании программ на JavaScript, сначала создается объект FSO для доступа к файловой системе, и ссылка на него сохраняется в переменной, например fso. Далее используются методы и свойства для получения информации о диске. Пусть переменная dpath содержит букву, которой обозначен диск, или путь к какой-нибудь папке, начинающийся с буквы диска. Тогда метод fso.GetDrive(path) возвращает ссылку на объект, содержащий информацию о диске, указанном в dpath. Пусть эта ссылка сохранена в переменной d. Теперь остается только получить значения свойств этого объекта, которые являются характеристиками диска. Чтобы определить, существует ли указанный в dpath диск, необходимо применить метод fso.DriveExists(dpath). Этот метод возвращает 1, если диск существует, в противном случае - 0. Свойство d.IsReady равно true, если диск готов, и false - в противном случае. Свойство d.FreeSpace содержит величину свободного пространства на диске в байтах.

    Ниже приведен код функции driveInfo(dpath), которая возвращает массив всех характеристик диска, указанного в качестве строкового параметра:

// Функция, выводящая информацию о диске. 
// Возвращает массив характеристик диска.
function driveInfo(dpath) 
{
  var fso = new ActiveXObject ("Scripting.FileSystemObject");
  var disk = fso.GetDriveName(dpath); // Имя (буква) диска
  var dinfo = new Array(7);
  if (fso.DriveExists(disk)) 
  { // Если диск существует...
    var d = fso.GetDrive(disk); // Объект с информацией о диске
    dinfo[0] = d.DriveLetter; // Буква диска
    dinfo[1] = d.IsReady; // Готовность диска
   dinfo[2] = d.DriveType; // Тип диска
   if (d.IsReady)  
   { // Если диск готов..
     dinfo[3] = d.VolumeName; // Имя диска
     dinfo[4] = d.SerialNumber; // Серийный номер диска
     dinfo[5] = d.TotalSize; // Полный объем в байтах
     dinfo[6] = d.FreeSpace; // Свободно в байтах
   }
 }
 return dinfo; //Возвращение массива характеристик диска
}

    Некоторые характеристики диска мы получаем только после проверки готовности диска (например, гибкий диск установлен в дисковод). Выражение var disk = fso.GetDriveName(dpath) используется, когда параметр функции содержит не просто букву диска, а путь к папке или файлу.

    Чтобы протестировать функцию driveInfo(dpath), можно после этой функции в файле разместить следующий код:

WScript.Echo(driveInfo("A:"));
WScript.Echo(driveInfo("C:"));
WScript.Echo(driveInfo("D:"));
WScript.Echo(driveInfo("G:"));
WScript.Echo(driveInfo("C:\\Мои документы"));
var x = driveInfo("C:");
WScript.Echo("Свободно: " + x[5]);
Текст этого файла можно взять здесь.

    Сохраните этот код в файле с расширением js и выполните его.

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

    Код функции driveTotalInfo(dpath):

// Информация о дисках
function driveTotalInfo(dpath) 
{                            
  var fso = new ActiveXObject ("Scripting.FileSystemObject");
  var disk;
  if (!dpath) //Если нет параметра, то все диски...
    disk = new Array("A", "B", "C", "D", "E", "F", "G", "H", 
    "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", 
    "T", "U", "V", "W", "X", "Y", "Z");
  else //... иначе одноэлементный массив
     disk = new Array (fso.GetDriveName(dpath));
  var s = "", t, d;
  for (i = 0; i<disk.length; i++) 
  {
    if (fso.DriveExists(disk[i])) 
    { // Если диск существует...
      d = fso.GetDrive(disk[i]) // Ссылка на диск
      switch (d.DriveType) 
      { // Тип диска
        case 0: t = " - неизвестный"; break;
        case 1: t = " - съемный"; break;
        case 2: t = " - несъемный"; break;
        case 3: t = " - сетевой"; break;
        case 4: t = " - CD-ROM"; break;
        case 5: t = " - виртуальный"; break;
      }
      s+= "Диск " + d.DriveLetter + ": ";  // Буква диска
      if (d.IsReady)
      { // Если диск готов...
        s+= d.VolumeName + t; // Тип диска
        s+= "\n SN: " + d.SerialNumber; // Серийный номер диска
        s+= "\n Объем: " + d.TotalSize; // Полный объем в байтах
        s+= "\n Свободно: " + d.FreeSpace; // Свободно в байтах
      }
      else  s+= t+ " не готов";
      s+= "\n\n";
    }
  }
  WScript.Echo(s);  // Вывод строки с характеристиками
}
Текст этого файла можно взять здесь.

    Результат выполнения этого файла сервером сценариев изображен на рисунке 1.


Рис.1. Пример результата работы функции driveTotalInfo()

    Чтобы использовать функцию driveTotalInfo(dpath) в сценарии, выполняемом браузером, необходимо лишь заменить в ней выражение WScript.Echo(s) на alert(s).

    Результат выполнения этой функции в браузере изображен на рисунке 2.


Рис.2. Пример результата работы функции driveTotalInfo() в браузере

Текст этого документа можно взять здесь.

    На следующем шаге мы рассмотрим работу с папками.




Предыдущий шаг Содержание Следующий шаг