Интернет, компьютеры, софт и прочий 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. Дополнительно

Навигация с помощью 'nsIFile'

Доступ к файлу в данной директории

Пусть переменная 'file' типа 'nsIFile' представляет некую директорию (например, директорию профайла пользователя). Тогда вы можете использовать 'file.append("myfile.txt");' для получения доступа к файлу 'myfile.txt', находящемуся в этой директории.

ЗАМЕЧАНИЕ: не рекоммендуется использовать код типа следующего:
dir.path+"\\"+"myfile.txt"
так как он не является кроссплатформенным. Вместо него можно использовать следующий:
((path.search(/\\/) != -1) ? path + "\\" : path + "/") + "myfile.txt";
но 'nsIFile.append()' гораздо короче, понятнее и, кроме того, гарантирует работоспособность на всех платформах, на которых работает Mozilla.

Перебор файлов из данной директории

Следующий код создает массив объектов 'nsIFile', соответствующих поддиректориям и файлам из данной директории. Для каждого элемента этого массива вы можете применить методы 'nsIFile.isDirectory()' и 'nsIFile.isFile()', чтобы отличить файлы от папок.

// 'file' является данной директорией ('nsIFile')
var entries = file.directoryEntries;
var array = [];
while(entries.hasMoreElements())
{
  var entry = entries.getNext();
  entry.QueryInterface(Components.interfaces.nsIFile);
  array.push(entry);
}

Чтение из файла

Простое

// 'file' должен являться 'nsIFile'
var data = "";
var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"].
                        createInstance(Components.interfaces.nsIFileInputStream);
var cstream = Components.classes["@mozilla.org/intl/converter-input-stream;1"].
                        createInstance(Components.interfaces.nsIConverterInputStream);
fstream.init(file, -1, 0, 0);
cstream.init(fstream, "UTF-8", 0, 0); // если хотите, вы можете использовать
                                      // другую кодировку
let (str = {}) {
  let read = 0;
  do {
    // читаете столько, сколько нужно и записываете вывод в 'str.value'
    read = cstream.readString(0xffffffff, str);
    data += str.value;
  } while (read != 0);
}
cstream.close(); // this closes fstream

alert(data);

Построчно

ЗАМЕЧАНИЕ: приведенный пример кода не работает с текстами, содержащими не-ASCII символы. В статье Чтение текстовых данных можно прочесть подробности о том, как читать тексты в других символьных наборах.
// открываете поток ввода из файла
var istream = Components.classes["@mozilla.org/network/file-input-stream;1"].
                        createInstance(Components.interfaces.nsIFileInputStream);
istream.init(file, 0x01, 0444, 0);
istream.QueryInterface(Components.interfaces.nsILineInputStream);

// читаете строки в массив
var line = {}, lines = [], hasmore;
do {
  hasmore = istream.readLine(line);
  lines.push(line.value); 
} while(hasmore);

istream.close();

// делаете что-то с прочтенными данными
alert(lines);

Асинхронно

Этот код позволит вам читать файл без блокировки процесса пользовательского интерфейса.

ЗАМЕЧАНИЕ: интерфейс 'nsIStreamLoader' был изменен в связи багом 233780. Так что теперь его метод 'init()' принимает только один параметр - слушатель. Следующий код показывает, как его вызывать корректно в зависимости от запущенной версии Gecko.
var appInfo=Components.classes["@mozilla.org/xre/app-info;1"]
                   .getService(Components.interfaces.nsIXULAppInfo);
var isOnBranch = appInfo.platformVersion.indexOf("1.8") == 0;
var ios=Components.classes["@mozilla.org/network/io-service;1"]
                  .getService(Components.interfaces.nsIIOService);
var fileURI=ios.newFileURI(file);
var channel = ios.newChannelFromURI(fileURI);
var observer = {
  onStreamComplete : function(aLoader, aContext, aStatus, aLength, aResult)
  {
    alert(aResult);
  }
};
var sl = Components.classes["@mozilla.org/network/stream-loader;1"].
                   createInstance(Components.interfaces.nsIStreamLoader);
if (isOnBranch) {
  sl.init(channel, observer, null);
} else {
  sl.init(observer);
  channel.asyncOpen(sl, channel);
}

Бинарный файл

Для определенности, получим данные из PNG-файла:

var ios = Components.classes["@mozilla.org/network/io-service;1"].
                    getService(Components.interfaces.nsIIOService);
var url = ios.newURI(aFileURL, null, null);

if (!url || !url.schemeIs("file")) throw "Неверный URL файла.";

var pngFile = url.QueryInterface(Components.interfaces.nsIFileURL).file;

var istream = Components.classes["@mozilla.org/network/file-input-stream;1"].
                        createInstance(Components.interfaces.nsIFileInputStream);
istream.init(pngFile, -1, -1, false);

var bstream = Components.classes["@mozilla.org/binaryinputstream;1"].
                        createInstance(Components.interfaces.nsIBinaryInputStream);
bstream.setInputStream(istream);

var bytes = bstream.readBytes(bstream.available());

Назад: Создание папок
Дальше: Запись в файл


Перевод с английского: Д.Скоробогатов, 24.09.2010.


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

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

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

Метки материала: com, программа, файл, mozilla, скрипты, браузер, программы для компьютера, программирование, javascript, ит, разработка программ, файловая система, xpcom, xulrunner, api, по, программное обеспечение, программы, софт, информационные технологии

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

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

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


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