Работа с объектами файловой системы


Чеботарев Игорь

В этой статье речь пойдет о работе с объектами файловой системы, а именно, с самими файлами и локальными дисками (дисководы, жесткие диски, CD-ROM'ы). Сетевые диски будут рассмотрены в одной из следующих статей.

Приведу небольшой пример и на его основе объясню принципы работы с дисками в Windows Script Host. Если вы еще не отключили сообщение системы о том что какой-то диск переполнен, то, наверняка, уже не раз лицезрели его. Мерзкая штука! Оно вам надо? Давайте, лучше, сами создадим такое сообщение.

'Проверка количества свободного места на дисках. VBScript
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set WSHShell = WScript.CreateObject("WScript.Shell")
'Проверяем все драйвы (HDD, FDD, CDD) в системе
For each i In fso.Drives
  'DriveType=2 - логические диски. Зачем нам дисковод и т.п. ерунда?
  If i.DriveType=2 Then
    'Получаем букву диска
    drive=i.DriveLetter
    'Узнаем свободное место и переводим его в Мб с 
    'точностью до 1 знака после запятой
    free = FormatNumber(fso.GetDrive(drive).FreeSpace/1048576, 1)
    'Если места меньше 100 Мб
    If free < 100 Then
      'то выводим сообщение об этом
      WSHShell.Popup("На диске "+drive+" осталось меньше 100 Мб. Свободно "+free+" Мб!")
    End If
  End If
Next

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

Если вы не будете фильтровать тип диска (строка If i.DriveType=2), то объем свободного места будет проверяться и на дискете в дисководе и на CD-ROM'e. А если в приводе не будет носителя, то скрипт прервется и будет выдано сообщение об ошибке.

DriveType имеет следующие значения:

0 - Тип не может быть определен
1 - Сменный носитель или дисковод для гибких дисков
2 - Обычный HDD
3 - Сетевой диск
4 - CD-ROM
5 - Виртуальный RAM-диск

Остановимся подробнее на строке free = FormatNumber (fso.GetDrive(drive).FreeSpace /1048576, 1). Свойство FreeSpace возвращает количество свободного дискового места в байтах. Конечно, работать с такими большими цифрами некомфортно, поэтому мы переводим байты в мегабайты, делением на 1048576. А чтобы не лицезреть кучу знаков после запятой, округляем до одного значащего символа с помощью FormatNumber() - количество знаков после запятой устанавливается с помощью второй переменной.

Если вам надо получить полный объем диска, то вместо FreeSpace используйте свойство TotalSize.

Вы можете явно указать диск, с которым хотите работать. Для этого используется метод GetDrive:

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set Drive = fso.GetDrive("c")

Чтобы узнать файловую систему диска используйте свойство FileSystem:

MsgBox(Drive.FileSystem)

Остальные свойства и методы работы с диском не так интересны. Среди них такие как:

DriveExists - проверяет на наличие заданного диска: fso.DriveExists("c").
IsReady - если диск готов к использованию, возвращает true, в противном случае - false.
RootFolder - возвращает путь к корневому каталогу.
SerialNumber - возвращает серийный номер диска.
ShareName - возвращает сетевое имя диска.
VolumeName - возвращает либо устанавливает метку диска.

Теперь обратим внимание на работу с файлами и папками. Редактирование файлов я бы хотел вынести в отдельную статью, а здесь коснемся вопросов создания, копирования, удаления файлов, установки атрибутов и т.п.

Для примера давайте создадим на диске С:\ папку TEST, а в ней файл test.txt:

//Создание папки и файла. JScript
var fso = new ActiveXObject("Scripting.FileSystemObject");
//Проверяем, есть ли такая папка
if (fso.FolderExists("C:\\TEST"))
   WScript.Echo("Такая папка уже существует"); 
else
//Если нет - создаем
   var Folder = fso.CreateFolder("C:\\TEST");
//Проверяем, есть ли уже такой файл
if (fso.FileExists("C:\\TEST\\test.txt")) 
   WScript.Echo("Такой файл уже существует"); 
else
//Если нет, то создаем его
   var File = fso.CreateTextFile("C:\\TEST\\test.txt", true);

Комментарии наглядно демонстрируют работу скрипта. Давайте только подробнее остановимся на создании файла (последняя строка). Вторым параметром передается значение true. Этот параметр является необязательным и указывает, перезаписывать ли файл с таким именем. Здесь же может передаваться и третий параметр. Если он отсутствует или равен false, то файл будет создан в кодировке ASCII. Если параметр равен true - в unicode.

В примере мы не просто создали папку и файл, но и создали объекты этой папки и файла (Folder и File соответственно). Если надо создать объект для уже существующей папки/файла, используйте метод GetFile/GetFolder:

var File1 = fso.GetFile("C:\\autoexec.bat");

К этим объектам применимы различные методы, позволяющие копировать, переименовывать, удалять файлы, получать о них различные сведения, устанавливать атрибуты. Как несложно догадаться для копирования, перемещения и удаления файлов и папок применяются методы Copy, Move и Delete. При этом в Copy и Move передается имя файла, в который надо скопировать/перенести исходный, а в Delete ничего не передается. Так, чтобы скопировать autoexec.bat в autoexec.tmp надо добавить строку

File1.Copy("C:\\autoexec.tmp");

Различные свойства объектов, созданных с помощью GetFile/GetFolder позволяют получить различные сведения о файлах и папках на которые они указывают. Вот эти свойства:

Size - возвращает размер файла/папки;
DateCreated - время создания;
DateLastAccessed - время последнего обращения к объекту;
DateLastModified - время последнего изменения.

Например:

WScript.Echo(File1.Size);

Бывают ситуации, когда надо получить имя файла, на который ссылается объект. Например:

var fso = new ActiveXObject("Scripting.FileSystemObject");
var File1 = fso.GetFile("C:\\autoexec.bat");
var File2 = fso.GetFile("C:\\config.sys");
var File3 = fso.GetFile("C:\\netlog.txt");
if (fso.FileExists("C:\\config.sys"))
   File1 = File2;
else
   File1 = File3;
WScript.Echo (File1.Name);

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

Name - возвращает обычное имя файла (папки);
ShortName - короткое имя (в формате MS-DOS). Длинные имена будут урезаны до формата 8.3;
Path - возвращает обычный путь к файлу (папке);
ShortPath - короткий путь (с тильдой "~");
ParentFolder - возвращает имя родительского каталога.

Как они работают вы уже могли видеть в предыдущем примере в последней строке.

Закончить рассмотрение данной темы мне бы хотелось описанием установки атрибутов файлов/папок и получением сведений о типе файла. Тип файла возвращает свойство Type. Вызывается оно аналогично описанным ранее свойствам:

WScript.Echo (File1.Type);

Если вы вызовите свойства файла по правому клику мышки, то на вкладке "Общие" в поле "Тип" будет как раз то описание, что возвращает это свойство.

Получать или устанавливать атрибуты файлам и папкам позволяет свойство Attributes. Так, посмотреть атрибуты нашего файла можно командой:

WScript.Echo (File1.Attributes);

В таблице приведены значения, которые может принимать данное свойство:


Константа  Значение  Действие Описание
Normal 0 чтение/запись Обычный файл без атрибутов
ReadOnly 1 чтение/запись Только чтение
Hidden 2 чтение/запись Скрытый
System 4 чтение/запись Системный
Volume 8 только чтение Метка диска
Directory 16 только чтение Папка
Archive 32 чтение/запись Архивный
Compressed 128 только чтение Сжатый файл


Если вам надо установить несколько свойств файлу, значения надо складывать. Например чтобы установить для файла атрибуты только для чтения, скрытый и системный, надо передать значение 1+2+4=7:

File1.Attributes = 7;

На этом объяснения по работе с объектами файловой системы позвольте закончить. В следующей статье будут подняты вопросы чтения и редактирования файлов.

читать еще по теме