在本地机器上读/写文件

时间:2012-03-19 20:53:35

标签: firefox-addon

我几乎从MDN File I/O页面复制了这段代码..除了我添加了一个if语句来检查文件是否已经存在,如果已存在,请改为阅读。

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

    var file = Components.classes["@mozilla.org/file/directory_service;1"].
               getService(Components.interfaces.nsIProperties).
               get("Desk", Components.interfaces.nsIFile);
    file.append("test.txt");

    if (!file.exists()) {
        this.user_id = Math.floor(Math.random()*10001) +'-'+ Math.floor(Math.random()*10001) +'-'+ Math.floor(Math.random()*10001) +'-'+ Math.floor(Math.random()*10001);

        var ostream = FileUtils.openSafeFileOutputStream(file)
        var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].
                        createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
        converter.charset = "UTF-8";
        var istream = converter.convertToInputStream(this.user_id);

        // The last argument (the callback) is optional.
        NetUtil.asyncCopy(istream, ostream, function(status) {
            if (!Components.isSuccessCode(status)) {
                alert('Error '+ status);
                return;
            }

            alert('File created');  
        });
    } else
    {
        NetUtil.asyncFetch(file, function(inputStream, status) {
            if (!Components.isSuccessCode(status)) {
                alert('error '+ status);
                return;
            }

            // The file data is contained within inputStream.
            // You can read it into a string with
            this.user_id = NetUtil.readInputStreamToString(inputStream, inputStream.available());
        });
        alert('File exists already, do not create');    
    }

    alert(this.user_id);

它创建文件就好了,我可以打开它并阅读它。但是,如果该文件已存在,则不会填充this.user_id ..只等于null。所以我的问题是专门阅读文件。

1 个答案:

答案 0 :(得分:2)

您的代码中的文件读取异步工作 - 意味着您的代码完成(包括alert()调用,这将显示this.user_idnull),然后在某些时候,来自NetUtil.asyncFetch()的回调被数据调用。在此之前,this.user_id将不会被设定。如果将alert(this.user_id)移动到回调函数中,则应显示正确的值。

请注意,强烈建议保持文件I / O操作的异步,因为它们可能需要很长时间,具体取决于文件系统的当前状态。但是你必须以不假设文件操作立即发生的方式构造你的代码。