XPCOM FileOutptStream追加不起作用

时间:2011-10-08 22:39:21

标签: file append xpcom xulrunner

有没有人设法说服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);

结果完全相同。

我使用XUL Explorer 1.0a1pre Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110421分发的XULRunner 1.9.2下运行代码。

任何线索都会非常感激。

3 个答案:

答案 0 :(得分:0)

根据定义,安全文件输出流无法附加到文件。它是安全的,因为它保证您的更改将被完整写入,或者您将获得异常,否则什么都不会改变。这是通过写入文件实现的,并且仅在写操作完成时重命名该文件以替换原始文件。当然,这种方法的副作用是你不能附加到文件,因为写操作发生在不同的文件中。

在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);

答案 1 :(得分:0)

这样怎么样:

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

答案 2 :(得分:-1)

解决:Wladimir Palant几乎是正确的安全文件输出流无法附加。但是我还需要从模式位中删除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();
}