Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru

Ввод и вывод из файла средствами XPCOM

Содержание

  1. Доступные библиотеки
  2. Создание объекта 'nsIFile' ("открытие" файлов)
  3. Доступ к специальным файлам
    1. Доступ к домашней директории пользователя
    2. Доступ к папке с вашим расширением
    3. Перебор дисков в Windows
  4. Создание папок
  5. Создание временных файлов
  6. Пользовательский ввод с помощью 'nsIFilePicker'
  7. 'nsIFile' и строковые пути
  8. Сохранение 'nsILocalFile' в преференциях
    1. Абсолютный путь ('nsILocalFile')
    2. Относительный путь ('nsIRelativeFilePref')
  9. Навигация с помощью 'nsIFile'
    1. Доступ к файлу в данной директории
    2. Перебор файлов из данной директории
  10. Чтение из файла
    1. Простое
    2. Построчно
    3. Асинхронно
    4. Бинарный файл
  11. Запись в файл
    1. Запись бинарного файла
    2. Копирование потока в файл
  12. Дополнительно

Эта статья описывает операции ввода/вывода в/из файла с помощью JavaScript из окружения 'chrome'.

Описывается, как работать с файловой системой используя компоненты XPCOM от Mozilla. Подробный список ресурсов и интерфейсов для локального ввода/вывода как для файлов, так и для потоков имеется в учебнике "XUL Planet".

ЗАМЕЧАНИЕ: объекты файлов представляют интерфейс 'nsIFile' или расширенный 'nsILocalFile'. Смотрите дополнительную информацию о них.

Доступные библиотеки

Существует несколько оберток над компонентами ввода/вывода XPCOM, написанных на JavaScript. Смотрите, в частности, JSLib и io.js (из пакета MonkeeSage). Библиотека "io.js" отличается малыми размерами и очень проста в использовании (в модуль включены простые примеры).

Создание объекта 'nsIFile' ("открытие" файлов)

var file = Components.classes["@mozilla.org/file/local;1"].
                     createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("/home");
ЗАМЕЧАНИЕ: путь, передаваемый в 'initWithPath()' должен иметь "нативную" форму (например, "C:\\Windows"). Если вы желаете использовать для инициализации URI вида 'file:///', прочитите описание 'nsIIOService', данное ниже.
ЗАМЕЧАНИЕ: функции 'initWithPath()' и 'initWithFile()' не бросают исключений, если указанный файл не существует. Исключения возникают тогда, когда вызываются методы, которые предполагают существование файла, такие как 'isDirectory()', 'moveTo()' и т.п.

Доступ к специальным файлам

// доступ к директории профайла
var file = Components.classes["@mozilla.org/file/directory_service;1"].
                     getService(Components.interfaces.nsIProperties).
                     get("ProfD", Components.interfaces.nsIFile);

// ЗАМЕЧАНИЕ: "файл" - это объект, который реализует интерфейс 'nsIFile'.
// Если вам нужен путь в файловой системе, используйте 'file.path'

Вместо строки "ProfD" в этом коде вы можете использовать другие (процентами ограничены комментарии в стиле модуля ввода/вывода MonkeeSage):

СтрокаЗначение
ProfDдиректория профайла
DefProfRtпользователь (например, '/root/.mozilla')
UChrm%profile%/chrome
DefRt%installation%/defaults
PrfDef%installation%/defaults/pref
ProfDefNoLoc%installation%/defaults/profile
APlugns%installation%/plugins
AChrom%installation%/chrome
ComsD%installation%/components
CurProcDдиректория установки (обычно)
Homeдиректория root-а данной ОС (например, '/root')
TmpDдиректория временных файлов данной ОС (например, '/tmp')
ProfLD'Local Settings' в Windows, где находится сетевой кэш и сохраняются загруженные файла
resource:appдиректория, в которой находится данное приложение XULRunner
Deskдиректория рабочего стола (например, '~/Desktop' в Linux, 'C:\Documents' и 'Settings\username\Desktop' в Windows)
Progsдиректория программ главного меню (например, 'C:\Documents and Settings\username\Start Menu\Programs')

В исходных кодах можно увидеть и другие доступные строки: xpcom/io/nsAppDirectoryServiceDefs.h, xpcom/io/nsDirectoryServiceDefs.h.

Доступ к домашней директории пользователя

var dirService = Components.classes["@mozilla.org/file/directory_service;1"].
                  getService(Components.interfaces.nsIProperties);
// получаем объект 'nsIFile'
var homeDirFile = dirService.get("Home", Components.interfaces.nsIFile);
var homeDir = homeDirFile.path;

Доступ к папке с вашим расширением

ЗАМЕЧАНИЕ: Это будет работать только в Firefox/Thunderbird 1.5+, но не 1.0.

Через 'nsIExtensionManager'

// идентификатор расширения из файла 'install.rdf'
var MY_ID = "myextension@my.name";
var em = Components.classes["@mozilla.org/extensions/manager;1"].
         getService(Components.interfaces.nsIExtensionManager);
// путь будет содержать прямые слэши ("/") в качестве разделителей
// получаем 'nsIFile' для 'install.rdf' требуемого расширения
var file = em.getInstallLocation(MY_ID).getItemFile(MY_ID, "install.rdf");
var filestring = file.path;

Через компонент XPCOM

Для получения директории, в которую установленно расширение, можно использовать компонент XPCOM, написанный на JavaScript. Специальная конструкция '__LOCATION__' возвращает файл компонента, в котором она вызывается, как 'nsIFile':

Код из 'extensiondir/component/GetExtensionDirectory.js':

var componentFile = __LOCATION__;
var componentsDir = componentFile.parent;
var extensionDir = componentsDir.parent;

Перебор дисков в Windows

В UNIX-подобных системах (Linux, Mac) вы можете использовать 'initWithPath("/")' для доступа к корню файловой системы. Однако в Windows такого корня не существует. Однако, в этой системе вы можете перебрать доступные диски с помощью следующего кода:

var root = Components.classes["@mozilla.org/file/local;1"].
                     createInstance(Components.interfaces.nsILocalFile);
root.initWithPath("\\\\.");
var drivesEnum = root.directoryEntries, drives = [];
while (drivesEnum.hasMoreElements()) {
  drives.push(drivesEnum.getNext().
    QueryInterface(Components.interfaces.nsILocalFile).path);
}

Дальше: Создание папок


Перевод с английского: Д.Скоробогатов, 24.09.2010. Оригинальный текст доступен по адресу https://developer.mozilla.org/en/Code_snippets/File_I%2F%2FO


Предыдущие публикации:

Биржа долевых инвестиций SIMEX.

Последнее редактирование: 2010-10-15 10:53:22

Метки материала: xpcom, файл, программирование, файловая система, xulrunner, javascript, mozilla, скрипты

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2017, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.