Как использовать FileSystemObject для чтения файла в JavaScript

Я хочу прочитать файл с помощью FileSystemObject. Мой код выглядит следующим образом:

<!DOCTYPE html>
<html lang="en">
<head>
<title>Read json</title>
</head>

<body>
<script type="text/javascript">

function readFile(filename){
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var ForReading = 1;
    var f1 = fso.OpenTextFile(filename, ForReading);
    var text = f1.ReadAll();
    f1.close();
    return text;
}

myJSONText = "text.txt";
var myObject = readFile(myJSONText);//eval('(' + myJSONText + ')');

document.write(myObject.name);
</script>
</body>
</html>

person Bryant    schedule 17.10.2012    source источник
comment
Ага ... Хорошо, сначала этот код выглядит нормально, пока вы в IE, так что я не уверен, что с ним не так. НО не делайте этого! Вы пытаетесь подготовить локальную файловую систему из клиентского браузера, что почти каждый браузер не позволяет. И хотя в IE (только в более старых версиях?) Это разрешено, это все еще проблема безопасности. Если вы хотите прочитать файл, вы должны предложить пользователю загрузить его, а затем прочитать его на сервере (или прочитать его на клиенте с использованием новых файловых API HTML5).   -  person Mark Kahn    schedule 17.10.2012
comment
Хорошо, спасибо за вашу помощь. А теперь позволь мне попробовать. Еще раз большое спасибо.   -  person Bryant    schedule 17.10.2012


Ответы (1)


Во-первых, позвольте мне повторить некоторые комментарии выше. Я никогда не видел, чтобы использование ActiveXObject на стороне клиента превозносилось как вещь, которую следует делать.

Теперь позвольте мне сказать, что я сам пытаюсь научиться это делать. Вот некоторые мысли (и полезные ссылки, см. Внизу) по этому вопросу.

Общий макет, согласно "Много ADO о текстовых файлах" в столбце клиники по написанию сценариев MSDN, это:

  1. Создайте объект.
  2. Создайте другой объект, используя первый, который использует метод первого объекта (например, получение файла).
  3. Сделайте что-нибудь с файлом.
  4. Закройте файл.

Как начать? Согласно IE Dev Center (ссылка здесь) используйте ActiveXObject в Javascript следующим образом:

newObj = new ActiveXObject(servername.typename[, location])

У вас есть это, когда вы объявляете fso в своем коде. А что насчет этой штуки с "именем сервера", разве к файлу не обращаются локально? Вместо "servername etc" вы указали Scripting.FileSystemObject. На самом деле это нормально, если ключ реестра HKEY_CLASSES_ROOT на главном ПК поддерживает его (см. Ссылку выше).

После успешного объявления ActiveXObject и если браузер разрешает это (только IE) и если конечный пользователь соглашается с любыми всплывающими предупреждениями («Элемент управления ActiveX на этой странице может быть небезопасным для взаимодействия с другими частями страницы. .. "и т. д.), затем объект позволяет вам использовать любой из методов, связанных с этим объектом. Вот где в игру вступает сила Windows Scripting FileSystemObject.

Теперь доступен любой метод FileSystemObject (fso), который, как следует из названия, означает взаимодействие с файлом (и каталогом) на локальном компьютере. Не только чтение, как ваш вопрос, но и запись и удаление. Полный список методов и свойств доступен на сайте MSDN здесь. После использования закройте файл с помощью метода .close().

Итак, это опасно по понятным причинам. Но что сначала для меня не было очевидным, так это то, что эти взаимодействия с файловой системой могут происходить невидимо. Существует большая вероятность того, что что бы вы ни делали, от чтения файла до удаления дерева каталогов, никаких предупреждений или командных подсказок не появится, чтобы вы знали, что происходит из-за ваших нескольких строк кода.

Позвольте мне закончить, прокомментировав последние фрагменты кода выше. Использование JSON в сочетании с данными, извлеченными из FileSystemObject, обеспечивает отличный способ разрешить взаимодействие с JavaScript (JSON .parse и .stringify сразу приходят на ум). Благодаря этому данные могут храниться локально, возможно, в качестве альтернативы локальному хранилищу HTML5 (см. этот поток SO, который идет дальше подробно об этой концепции и еще одном вопросе SO, который я поднял по поводу этого здесь).

Вот несколько ссылок для дальнейшего чтения:
Центр разработки IE, объекты JavaScript, ActiveXObject
Скрипты MSDN JScript для Windows (включая методы FileSystemObject и т. д.)
MSDN Scripting Clinic (старые статьи, много неработающих ссылок, но по-прежнему много полезной информации по этому поводу)

person Aaron Thomas    schedule 08.08.2014
comment
Комментарии об актуальности. Этот ответ относится к файлам HTA и WScript, а также к IE. - person Jefferey Cave; 24.09.2014