Ввод и вывод из файла средствами XPCOM
Содержание
- Доступные библиотеки
- Создание
объекта 'nsIFile' ("открытие" файлов)
- Доступ к специальным файлам
- Доступ к домашней директории
пользователя
- Доступ к папке с вашим
расширением
- Перебор дисков в Windows
-
Создание папок
-
Создание временных файлов
-
Пользовательский ввод с помощью 'nsIFilePicker'
-
'nsIFile' и строковые пути
-
Сохранение 'nsILocalFile' в преференциях
-
Абсолютный путь ('nsILocalFile')
-
Относительный путь ('nsIRelativeFilePref')
-
Навигация с помощью 'nsIFile'
-
Доступ к файлу в данной директории
-
Перебор файлов из данной директории
-
Чтение из файла
- Простое
-
Построчно
-
Асинхронно
-
Бинарный файл
-
Запись в файл
-
Запись бинарного файла
-
Копирование потока в файл
- Дополнительно
Эта статья описывает операции ввода/вывода в/из файла с помощью 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
Предыдущие публикации:
Последнее редактирование: 2010-10-15 10:53:22
Метки материала:
xpcom, файл, программирование, файловая система, xulrunner, javascript, mozilla, скрипты
Оставьте, пожалуйста, свой комментарий к публикации
|