Приложение XPOOM FileOutptStream не работает - PullRequest
1 голос
/ 09 октября 2011

Кому-нибудь удалось убедить XPCOM сделать запись с добавлением в локальный файл? Блок кода ниже отлично работает с 0x08 (создать, если не существует) в флагах. Но 0x10, добавить в конец существующего файла просто, самолет не работает! Также привилегированные биты 0666 не имеют. Файл всегда создается 0644.

Components.utils.import("resource://gre/modules/FileUtils.jsm");

var Cc=Components.classes;
var Ci=Components.interfaces;

function writeFile(fileName,data){
  var file = FileUtils.getFile("Home", [fileName]);

  var fileStream=FileUtils.openSafeFileOutputStream(file, 0x02 | 0x10 | 0x20, 0666, 0);
                                                             //  ^^^^ does not work! 0x08 does.

  fileStream.write(data,data.length);
  FileUtils.closeSafeFileOutputStream(fileStream);
}

Я пытался открыть поток без использования FileUtils. Как это:

var fileStream = Cc["@mozilla.org/network/safe-file-output-stream;1"].
                   createInstance(Ci.nsIFileOutputStream);
fileStream.init(file, 0x02 | 0x10 | 0x20, 0666, 0);

С точно такими же результатами.

Я запускаю код под XULRunner 1.9.2, распространяемый вместе с XUL Explorer 1.0a1pre, Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110421.

Любые подсказки будут очень признательны.

Ответы [ 3 ]

0 голосов
/ 09 октября 2011

Как насчет этого:

function readFile(savefile) {
//alert('hi');
   try {
        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
    } catch (e) {
        alert("Permission to read file was denied.");
    }
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
    file.initWithPath( savefile );
    if ( file.exists() == false ) {
        alert("File does not exist");
    }
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); // you can use another encoding here if you wish

let (str = {}) {
  let read = 0;
  do {
    read = cstream.readString(0xffffffff, str); // read as much as we can and put it in str.value
    data += str.value;
  } while (read != 0);
}

Этим методом вы можете читать 16/32/64 битный формат записи.

function saveFile(output, savefile)
{                                                            
    try {
        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
    } catch (e) {
        alert("Permission to save file was denied.");
    }
var file = Components.classes["@mozilla.org/file/local;1"].
createInstance(Components.interfaces.nsILocalFile);
    file.initWithPath( savefile );
    if ( file.exists() == false ) {
        alert( "File Updated Successfully ");
        file.create( Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 420 );
    }
    var outputStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
        .createInstance( Components.interfaces.nsIFileOutputStream );
    outputStream.init( file, 0x04 | 0x08 | 0x20, 420, 0 );
var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].
                    createInstance(Components.interfaces.nsIConverterOutputStream);
    converter.init(outputStream, "UTF-8", 0, 0);
    converter.writeString(output);
    converter.close(); // this closes foStream

    outputStream.close();
//alert( "File Updated Successfully ");
}

У вас нет импорта: resource://gre/modules/FileUtils.jsm

0 голосов
/ 10 октября 2011

РЕШЕНО: Владимир Палант почти прав: безопасный вывод файла не может быть добавлен. Однако мне также нужно удалить 0x20 (усечение) из битов режима.

Следующие работы:

Components.utils.import("resource://gre/modules/FileUtils.jsm");
var Cc=Components.classes;
var Ci=Components.interfaces;

function appendFile(fileName,data){
  var file = FileUtils.getFile("Home", [fileName]);
  var fileStream = Cc["@mozilla.org/network/file-output-stream;1"].
                     createInstance(Ci.nsIFileOutputStream);
  fileStream.init(file, 0x02 | 0x10 , 0666, 0);
  fileStream.write(data,data.length);
  fileStream.close();
}
0 голосов
/ 09 октября 2011

Поток вывода файла safe не может добавляться к файлам по определению.Это безопасно, поскольку гарантирует, что либо ваши изменения будут записаны полностью, либо вы получите исключение, иначе ничего не изменится.И это реализуется путем записи в новый файл и переименования этого файла только для замены исходного, когда операция записи завершена.Конечно, побочным эффектом этого подхода является то, что вы не можете добавить файл, потому что операция записи происходит с другим файлом.

В Firefox / Gecko 7 или выше вы можете использовать FileUtils.openFileOutputStream(), чтобы открыть обычный поток вывода файла.В старых версиях вам нужно будет использовать «обычный» подход:

var fileStream = Cc["@mozilla.org/network/file-output-stream;1"].
                   createInstance(Ci.nsIFileOutputStream);
fileStream.init(file, 0x02 | 0x10 | 0x20, 0666, 0);
...