ホーム‎ > ‎私の開発環境‎ > ‎

Firefoxのjavascriptでローカルファイルにアクセスする方法まとめ

http://www-al.nii.ac.jp/~kameda/blog/KMKM/KMKM0711030805.htm

Nov 03, 2007

Firefoxのjavascriptでローカルファイルにアクセスする方法まとめ

まとめというかソースコードを載せる。
日本語ファイルが使えるように

  • Components.interfaces.nsIConverterOutputStream
  • Components.interfaces.nsIConverterInputStream
を使っています。
filePathはフルパスのみ可能です。

ファイル入力

返り値が内容です。
function open_file(filePath){
 var data = "";
 try {
   netscape.security.PrivilegeManager.enablePrivilege ('UniversalXPConnect');
   var file = Components.classes["@mozilla.org/file/local;1"].createInstance (Components.interfaces.nsILocalFile);
   file.initWithPath (filePath);
   var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
   fstream.init(file, -1, 0, 0);
   var charset = "UTF-8";
   const replacementChar = Components.interfaces.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER;
   var is = Components.classes["@mozilla.org/intl/converter-input-stream;1"].createInstance(Components.interfaces.nsIConverterInputStream);
is.init(fstream, charset, 1024, replacementChar);
   var str = {};
   while (is.readString(4096, str) != 0) {
     data += str.value;
   }
  } catch (e) {
   throw e;
  }
  return data;
}

ファイル出力

第二引数で内容を与えます。
function writeToFile (filePath, content) {
 try {
   netscape.security.PrivilegeManager.enablePrivilege ('UniversalXPConnect');
   var file = Components.classes["@mozilla.org/file/local;1"].createInstance (Components.interfaces.nsILocalFile);
   file.initWithPath (filePath);
   if (! file.exists ()) file.create (0, 0664);
   var out = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance (Components.interfaces.nsIFileOutputStream);
   out.init (file, 0x20 | 0x02, 00004, null);
   var charset = "UTF-8";
   var conv = Components.classes["\@mozilla.org/intl/converter-output-stream;1"].createInstance(Components.interfaces.nsIConverterOutputStream);
   conv.init(out, charset, 0, 0x0000);
   conv.writeString(content);
   conv.close();   
  } catch (e) {
   throw e;
  }
}

参考文献

関連エラー

uncaught exception: Permission denied to get property UnnamedClass.classes
netscape.security.PrivilegeManager.enablePrivilege ('UniversalXPConnect');
で権限を与えていないと起こります。
uncaught exception: [Exception... "Component returned failure code: 0x80520001 (NS_ERROR_FILE_UNRECOGNIZED_PATH) [nsILocalFile.initWithPath]" nsresult: "0x80520001 (NS_ERROR_FILE_UNRECOGNIZED_PATH)"
ファイル名がフルパスでないなど不正な場合に起こります。
processData is not defined
参考文献中のコードでそのまま実行すると出ます。
他にもあったけど忘れました。開発中に出たエラーコード一覧と解決策をQ&A形式で自動的にログをとるソフトがあるとすばらしいと思います。
Posted at 08:05 | WriteBacks (1) | Edit
WriteBacks

ローカルファイルへの書き込み(その2)

できたー!!! というか、発見したー!! かめだあきひろさん、ありがとうございました! いやね、他にもたくさんサンプルを挙げてくれているサイトやブログさんはあるのですよ。本家とかね。 でも、自分の環境でやるとうまく動いてくれない。。 さて、ローカルファイルへ

Posted by awacio.log at 2010/02/21 (Sun) 11:51:12
TrackBack ping me at
http://www-al.nii.ac.jp/~kameda/blog/KMKM/KMKM0711030805.trackback

Comments