【问题标题】:XPCOM FileOutptStream append does not workXPCOM FileOutptStream 附加不起作用
【发布时间】:2011-10-10 04:13:34
【问题描述】:

有没有人设法说服 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 分发的 XULRunner 1.9.2 下运行代码,Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110421

任何线索将不胜感激。

【问题讨论】:

  • 我认为这个问题更加微妙。我查看了 file.js File.prototype.open ,它是模式标志的目的地。我在参数传递中看到至少 3 个错误! Open 似乎需要一个字符串,但是 switch 语句的情况是数字的,因此唯一的情况是默认的。我正在深入挖掘。

标签: file append xpcom xulrunner


【解决方案1】:

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

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

【讨论】:

  • 我不明白你对“安全!我可以多次写入同一个文件。只是无法附加文档建议的方式。
  • 查看 file-utils.js 似乎“安全”指的是权限 644 被强制阻止可执行文件和模式被强制写入、创建和截断。
  • 这不是我对“安全”的定义,而是这里的意思。当然,您可以多次写入同一个文件,但每次写入临时文件时,写入操作的目标仅在最后一步被替换。
【解决方案2】:

这样怎么样:

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

【讨论】:

    【解决方案3】:

    已解决: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();
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-26
      • 1970-01-01
      • 2014-02-06
      • 2013-09-29
      • 2017-02-25
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      相关资源
      最近更新 更多