Шаг 62.
Основы JavaScript.
Работа с файлами. Создание текстового файла

    На этом шаге мы рассмотрим функцию, создающую текстовый файл.

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

  var fso = new ActiveXObject("Scripting.FileSystemObject");
  fso.CreateTextFile(filepath);

    Конструкция fso.CreateTextFile(filepath) создает указанный файл, открывает с доступом для записи и возвращает ссылку на него, если операция прошла успешно. В противном случае выводится диалоговое окно с сообщением об ошибке. Созданный файл остается недоступным для записи.

    filepath - строка, содержащая полный путь к создаваемому файлу, например "С:\\Мои документы\\testfile.txt". Для выполнения с помощью WSH вместо первого выражения можно использовать и такое:

  var fso = WScript.CreateObject("Scripting.FileSystemObject");

    Второй способ создания текстового файла основан на применении метода OpenTextFile с параметром режима открытия ForWriting. Этот параметр имеет значение 2. Это делается следующим образом:

  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var f = fso.OpenTextFile(filepath, 2);

    Новый текстовый файл, созданный описанными выше методами, ничего не содержит. Создаваемый и открываемый для чтения или записи текстовый файл совсем не обязательно должен иметь расширение txt. Расширение может быть любым. Главное, чтобы он был текстовым по своему типу.

    При создании файла на диске прежде всего необходимо убедиться в возможности это сделать, чтобы избежать появления сообщений об ошибках. Так, если хотя бы одна из папок в пути к файлу не существует, то попытка применить метод CreateTextFile() приведет к ошибке. Ошибка возникнет и в случае неготовности диска, отсутствия указанного дисковода, а также в случае, если это устройство для чтения компакт-дисков. Ниже приведен код функции createFile(filepath), которая выполняет все необходимые проверки. Кроме того, создаются папки, указанные в filepath, но не существующие.

    Код функции createFile(filepath):

// Создание текстового файла. Возвращает ссылку на 
// созданный файл или 0, если файл не создан
function createFile(filepath)
{
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var i = filepath.lastIndexOf("\\");
  // Выделяем имя файла из filepath
  if (i>=0) file = filepath.substr(i+1);
  // Выделяем путь к файлу без имени файла
  var folder = filepath.slice(0, i);
  // Проверки и создание недостающих папок
  if (!createFolder(folder)) return 0;
  // Если файл существует, то...
  if (fso.FileExists(file))
    // ...открываем его для записи
   return fso.OpenTextFile(filepath, 2);
  // Создаем файл и возвращаем ссылку на него
  return fso.CreateTextFile(folder + "\\" + file);
}

    Функция createFolder() создает папки. Она производит все проверки и при необходимости создает недостающие папки. Если указанный в параметре filepath файл уже существует на диске, то он открывается для записи.

    В рассмотренной выше функции createFile(filepath) для выделения имени файла из его полного имени filepath мы использовали встроенные функции JavaScript: lastIndexOf(), substr() и slice(). Однако вместо этого можно было использовать и специальные методы объекта файловой системы:

  1. GetBaseName(filepath); - возвращает последний элемент в filepath без расширения;
  2. GetExtensionName(filepath); - возвращает расширение последнего элемента в filepath.


    Пример.
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  fso.GetBaseName("C:\\Мои документы\\testfile.txt");           // testfile
  fso.GetExtensionName("С:\\Мои документы\\testfile.txt");    // txt

    He менее полезным является метод BuildPath(path, name), который к пути path дописывает элемент name:

  var fso = new ActiveXObject("Scripting.FileSystemObject");
  fso.BuildPath("C:\\Мои документы", "testfile.txt");

    Если файл был создан, то он остается открытым. Чтобы закрыть файл, используется метод Close().


    Пример.
  // Создание и закрытие файла:
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var myfile = fso.CreateTextFile("С:\\Мои документы\\testfile.txt");
  var myfile.Close();
  // Открытие и закрытие файла:
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var f = fso.OpenTextFile("С:\\Мои документы\\testfile.txt", 2);
  var myfile.Close();
  // Создание/открытие и закрытие файла:
  var myfile = createFile("C:\\Мои документы\\testfile.txt");
  var myfile.Close();

    В заключение приведем пример, иллюстрирующий использование рассмотренных конструкций.

<HTML>
<HEAD>
<TITLE>Создание файла</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
/* Создание папки. Возвращает -1, если папка создана или  */
/* существует, 0 - в противном случае */
function createFolder(folderpath) 
{
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var disk = fso.GetDriveName(folderpath); // Имя (буква) диска
  // Проверка характеристик диска:
  if (!fso.DriveExists(disk)) return 0 // ...если диск не существует
  if (!fso.GetDrive(disk).IsReady) return 0 // ...если диск не готов
  // ...если не подходит тип диска
  if (fso.GetDrive(disk).DriveType == 0 || 
     fso.GetDrive(disk).DriveType == 4)
       return 0;
  if (fso.GetDrive(disk).FreeSpace < 1024) return 0; // ...если мало места
  if (fso.FolderExists(folderpath)) return -1; // Если папка уже существует, 
                                               // то не создаем ее
  var apath = folderpath.split("\\");
  // Преобразуем в массив имен папок
  for (i = 1; i<apath.length; i++)
  {
    disk+= "\\" + apath[i];
    if (!fso.FolderExists(disk)) // Если папка не существует,
        fso.CreateFolder(disk);  // то создаем ее
  }
  //Bозвращаем результат проверки существования созданной папки
  return fso.FolderExists(folderpath);
}
// Создание текстового файла. Возвращает ссылку на 
// созданный файл или 0, если файл не создан
function createFile(filepath)
{
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var i = filepath.lastIndexOf("\\");
  // Выделяем имя файла из filepath
  if (i>=0) file = filepath.substr(i+1);
  // Выделяем путь к файлу без имени файла
  var folder = filepath.slice(0, i);
  // Проверки и создание недостающих папок
  if (!createFolder(folder)) return 0;
  // Если файл существует, то...
  if (fso.FileExists(file))
    // ...открываем его для записи
   return fso.OpenTextFile(filepath, 2);
  // Создаем файл и возвращаем ссылку на него
  return fso.CreateTextFile(folder + "\\" + file);
}

function f1(x)
{
  if (!createFile(x))
      alert ("Возникла ошибка");
  else alert ("Файл создан");
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<H2>Создание файла</H2>
<FORM NAME="frm1">
<INPUT TYPE="TEXT" SIZE="40" VALUE="C:\\Мои документы\\Test\\textfile.txt" 
    NAME="pole"><BR>
<INPUT TYPE="BUTTON" ONCLICK="f1(frm1.pole.value)" VALUE="Создать файл">
</FORM>
</BODY>
</HTML>
Текст этого документа можно взять здесь.

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


Рис.1. Результат выполнения функции создания файла

    На следующем шаге мы рассмотрим другие операции, выполняемые над файлами.




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