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

Запись в файл

// 'file' должен быть 'nsIFile', 'data' должно быть строкой
var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].
                         createInstance(Components.interfaces.nsIFileOutputStream);

// используйте '0x02 | 0x10', чтобы открыть файл для дозаписи.
foStream.init(file, 0x02 | 0x08 | 0x20, 0666, 0);
// записать, создать, очистить
// В языке C для операций с файлом мы должны открыть его в определенном режиме,
// которые обычно обозначаются как "r" или "w".

// Если вы уверены, что никогда не будете иметь дело с не-ASCII данными
// (нетекстовыми), вы можете непосредственно обращаться к 'foStream.writeData'.
var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].
                          createInstance(Components.interfaces.nsIConverterOutputStream);
converter.init(foStream, "UTF-8", 0, 0);
converter.writeString(data);
converter.close(); // закрываем 'foStream'
ЗАМЕЧАНИЕ: флаги статусов файла, используемые в функции 'nsIFileOutputStream::init()' документированы в 'PR_Open'. Дополнительную информацию можно получить непосредственно из 'nsprpub/pr/include/prio.h'.

Запись бинарного файла

Вот как записывать, например, PNG-данные в файл:

// 'pngBinary' уже существует
var aFile = Components.classes["@mozilla.org/file/local;1"]
                      .createInstance(Components.interfaces.nsILocalFile);

aFile.initWithPath( "/tmp/mypicture.png" );
aFile.createUnique( Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 600);

var stream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"].
                       createInstance(Components.interfaces.nsIFileOutputStream);
// чтение/запись, создание, очистка
stream.init(aFile, 0x04 | 0x08 | 0x20, 0600, 0);

stream.write(pngBinary, pngBinary.length);
if (stream instanceof Components.interfaces.nsISafeOutputStream) {
    stream.finish();
} else {
    stream.close();
}

Копирование потока в файл

Следующая функция возвращает простого слушателя потока, который копирует все данные из потока ввода в файл. В качестве аргумента она принимает 'nsIFile', который будет открыт или создан. Вам следует переопределить функции 'onStartRequest' и 'onStopRequest' в зависимости от того, что вы хотите делать, соответственно, при создании файла и его закрытии.

function StreamToFile(file)
{
    var output = Components.classes["@mozilla.org/network/file-output-stream;1"].
                           createInstance(Components.interfaces.nsIFileOutputStream);
    var buffer = Components.classes["@mozilla.org/network/buffered-output-stream;1"].
                           createInstance(Components.interfaces.nsIBufferedOutputStream);
    output.init(file, 0x02 | 0x08 | 0x20, 0664, null);
    buffer.init(output, 8192);

    return {
        onStartRequest: function(request, context) { },

        onDataAvailable: function onDataAvailable(request, context, stream, offset, count)
        {
            while(count > 0)
                count -= buffer.writeFrom(stream, count);
        },

        onStopRequest: function(request, context) { }
    };
}

Дополнительно

Чтобы больше узнать о методах и свойствах интерфейсов 'nsIFile' и 'nsILocalFile' читайте документацию от проекта "XUL Planet". Многие из описанных там методов и свойств не требуют объяснений, так что мы не включили их в примеры данной статьи.

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


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


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

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

Последнее редактирование: 2010-10-15 11:17:23

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

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

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

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


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