有没有人设法说服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下运行代码。
任何线索都会非常感激。
答案 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();
}