tcaudilllg Dragonmaster
  
  Joined: 20 Jun 2002 Posts: 1731 Location: Cedar Bluff, VA 
     | 
    
      
        
           Posted: Mon Aug 09, 2010 4:16 pm    Post subject: How to read/write files in Firefox. | 
          [quote]    | 
         
        
          
  | 
         
        
          
            I don't have to mention how awesome the topic of this post is, so I won't.
 
 
The first step is to get the necessary permissions from Firefox. You do this by interfacing with XPCOM, Mozilla's answer to Microsoft's COM. ("Component Object Model")
 
 
 	  | Code: | 	 		  
 
this.netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
 
 | 	  
 
 
Sometimes you have to change a flag in about:config first, depending on whether or not you've previously locked down your Firefox install. Oh, and deactivate NoScript while you're at it.
 
 
 
Firefox read/write is definitely NSFW -- you could be fired if a security compromise caused by read/write permissions is found to have originated on your terminal.
 
 
Without further ado, the code.
 
 
 	  | Code: | 	 		  
 
<html>
 
 
<head>
 
 
<script>
 
 
// IO.JS - file input/output for Firefox
 
// ...And every bit of it ripped from MDC's examples. Seriously though, I don't think they could have made it any more complicated. :P
 
 
this.netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
 
 
 
function writeFile (fileData, filePath)
 
{
 
 
   // "fileData" is a string containing the data to write. "filePath" is a string containing the complete path for the file.
 
   // This function writes a string to a file, erasing its previous content.
 
 
   var file = Components.classes["@mozilla.org/file/local;1"]  
 
   .createInstance(Components.interfaces.nsILocalFile);
 
  
 
   file.initWithPath( filePath );    
 
   file.createUnique( Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 600);
 
            
 
   var stream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"]
 
   .createInstance(Components.interfaces.nsIFileOutputStream);
 
   
 
   stream.init(file, 0x04 | 0x08 | 0x20, 0600, 0); // readwrite, create, truncate
 
            
 
   stream.write(fileData, fileData.length);
 
 
   if (stream instanceof Components.interfaces.nsISafeOutputStream) {
 
      stream.finish();
 
   } else {
 
      stream.close();
 
   }
 
 
}
 
 
 
function readFile (filePath)
 
{
 
 
   // "filePath" is a string containing the complete path of the file to be read.
 
   // This function returns a string containing the data of the read file.
 
 
   var file = filePath;
 
      
 
   var incoming = Components.classes["@mozilla.org/network/file-input-stream;1"]
 
   .createInstance(Components.interfaces.nsIFileInputStream);
 
   incoming.init(file, -1, -1, false);
 
 
   var cache = Components.classes["@mozilla.org/binaryinputstream;1"]
 
   .createInstance(Components.interfaces.nsIBinaryInputStream);
 
   cache.setInputStream(incoming);
 
 
   return cache.readBytes(cache.available());
 
 
}
 
 
 
function saveFile (fileData, filter)
 
{
 
 
   // "fileData" is a string containing the data to write. "filter" is the file's default extension.
 
   // This function allows the user to save a file with the save-as dialogue box.
 
   
 
   // This first segment allows that a file be picked with the open/save dialogue window.
 
   const nsIFilePicker = Components.interfaces.nsIFilePicker;
 
 
   var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
 
   filePicker.init(window, "", nsIFilePicker.modeSave);
 
   if (filter == "")
 
   {
 
      filePicker.appendFilters(nsIFilePicker.filterAll);
 
   }
 
   else
 
   {
 
      filePicker.appendFilter("*." + filter, "*." + filter);
 
   }
 
 
   var selection = filePicker.show();
 
   if (selection == nsIFilePicker.returnOK || selection == nsIFilePicker.returnReplace)
 
   {
 
   
 
      // This is the actual code to write the file.
 
   
 
      var file = Components.classes["@mozilla.org/file/local;1"]  
 
      .createInstance(Components.interfaces.nsILocalFile);  
 
  
 
      file.initWithPath( filePicker.file.path );    
 
      file.createUnique( Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 600);
 
            
 
      var stream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"]
 
      .createInstance(Components.interfaces.nsIFileOutputStream);
 
   
 
      stream.init(file, 0x04 | 0x08 | 0x20, 0600, 0); // readwrite, create, truncate
 
            
 
      stream.write(fileData, fileData.length);
 
 
      if (stream instanceof Components.interfaces.nsISafeOutputStream) {
 
         stream.finish();
 
      } else {
 
         stream.close();
 
      }
 
   }
 
 
}
 
 
 
function openFile (filter)
 
{
 
 
   // "filter" is a string specifying which files extensions to show in the open dialogue box.
 
   // This function allows the user to open a file with the open dialogue box. It returns a string with the file's contents.
 
   
 
   // This first segment allows that a file be picked with the open/save dialogue window.
 
   this.netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
 
 
   const nsIFilePicker = Components.interfaces.nsIFilePicker;
 
 
   var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
 
   filePicker.init(window, "", nsIFilePicker.modeOpen);
 
   if (filter == "")
 
   {
 
      filePicker.appendFilters(nsIFilePicker.filterAll);
 
   }
 
   else
 
   {
 
      filePicker.appendFilter("*." + filter, "*." + filter);
 
   }
 
 
   var selection = filePicker.show();
 
   if (selection == nsIFilePicker.returnOK || selection == nsIFilePicker.returnReplace)
 
   {
 
 
      // This is the actual code to read the file.
 
   
 
      var file = filePicker.file;
 
      
 
      var incoming = Components.classes["@mozilla.org/network/file-input-stream;1"]
 
      .createInstance(Components.interfaces.nsIFileInputStream);
 
      incoming.init(file, -1, -1, false);
 
 
      var cache = Components.classes["@mozilla.org/binaryinputstream;1"]
 
      .createInstance(Components.interfaces.nsIBinaryInputStream);
 
      cache.setInputStream(incoming);
 
 
      return cache.readBytes(cache.available());
 
   }
 
   
 
}
 
 
</script>
 
 
</head>
 
 
<textarea></textarea>
 
 
<input>
 
<input>
 
 
</html>
 
 | 	  
 
 
Users may be asked to affirm whether they want to allow your script access to their file system. Obviously, you want them to click "yes".
            
           | 
         
       
     |