2

Since Greasemonkey can't read/write files from a local hard disk, I've heard people suggesting Google gears but I've no idea about gears.

So, I've decided to add a

<script type="text/javascript" src="file:///c:/test.js">/script>

Now, this test will use FileSystemObject to read/write file. Since, the file:///c:/test.js is a javascript file from local hard disk, it should probably be able to read/write file on my local hard disk.

I tried it but Firefox prevented the file:///c:/test.js script to read/write files from the local disk. :(

Is there any setting in Firefox's about:config where we can specify to let a particular script, say from localfile or xyz.com, to have read/write permission on my local disk files?

Brock Adams
  • 90,639
  • 22
  • 233
  • 295
Nok Imchen
  • 2,802
  • 7
  • 33
  • 59
  • 1
    It's not the location of the *script* that determines the Origin it operates in under the Same Origin Policy, but the location of the page including the script. In any case, ‘FileSystemObject’ is an ActiveX control so no such thing exists in Firefox. – bobince May 17 '10 at 01:19

1 Answers1

4

You can use these within chrome scope.

var FileManager =
{
Write:
    function (File, Text)
    {
        if (!File) return;
        const unicodeConverter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
            .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);

        unicodeConverter.charset = "UTF-8";

        Text = unicodeConverter.ConvertFromUnicode(Text);
        const os = Components.classes["@mozilla.org/network/file-output-stream;1"]
          .createInstance(Components.interfaces.nsIFileOutputStream);
        os.init(File, 0x02 | 0x08 | 0x20, 0700, 0);
        os.write(Text, Text.length);
        os.close();
    },

Read:
    function (File)
    {
        if (!File) return;
        var res;

        const is = Components.classes["@mozilla.org/network/file-input-stream;1"]
            .createInstance(Components.interfaces.nsIFileInputStream);
        const sis = Components.classes["@mozilla.org/scriptableinputstream;1"]
            .createInstance(Components.interfaces.nsIScriptableInputStream);
        is.init(File, 0x01, 0400, null);
        sis.init(is);

        res = sis.read(sis.available());

        is.close();

        return res;
    },
}

Example:

var x = FileManager.Read("C:\\test.js");

See Also

BrunoLM
  • 97,872
  • 84
  • 296
  • 452