2012-04-05 14 views
5

मुझे जावास्क्रिप्ट से एक्सटेंशन स्थापित निर्देशिका का पथ प्राप्त करने की आवश्यकता है।एक्सटेंशन की निर्देशिका कैसे निर्धारित करें

मेरा लक्ष्य किसी फ़ायरफ़ॉक्स एक्सटेंशन से एक्सटेंशन निर्देशिका में JSON फ़ाइल को लिखना है। ऐसा करने के लिए, मुझे उस निर्देशिका को निर्धारित करने की आवश्यकता है जिसमें फ़ायरफ़ॉक्स प्रोफ़ाइल के भीतर एक्सटेंशन इंस्टॉल किया गया हो।

function writeToFile() 
{ 
    var id = "[email protected]";// The extension's id from install.rdf(i.e. <em:id>) 
    var ext = Components.classes["@mozilla.org/extensions/manager;1"] 
         .getService(Components.interfaces.nsIExtensionManager) 
         .getInstallLocation(id) 
         .getItemLocation(id); 
    var file = Components.classes["@mozilla.org/file/local;1"] 
         .createInstance(Components.interfaces.nsILocalFile); 
    file.initWithPath(ext.path); 
    file.append("config.json");  
    var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"] 
          .createInstance(Components.interfaces.nsIFileOutputStream); 
    foStream.init(file, 0x02 | 0x08 | 0x20, 0666, 0); 
    var data = '[ {"id" : "2"} ]'; 
    foStream.write(data, data.length); 
    foStream.close(); 

यह निम्न त्रुटि फेंकता है:

मैं इस कोड का उपयोग

TypeError:Components.classes['@mozilla.org/extensions/manager;1'] is undefined. 

मैं अनिवार्य रूप से जावास्क्रिप्ट से स्वचालित रूप से विस्तार की राह पाने के लिए की जरूरत है। मैंने अपने एक्सटेंशन की आईडी की दोबारा जांच की और मैंने भाग्य के साथ अन्य एक्सटेंशन से फ़ाइलों को लिखने का भी प्रयास किया।


आपके उत्तरों के लिए बहुत बहुत धन्यवाद। यह मुझे तुरंत मेरी समस्या को हल करने नहीं दिया लेकिन यह मुझे मोज़िला दस्तावेज पढ़ने के लिए मजबूर कर दिया। आखिरकार मुझे यह पता चला कि यह कैसे काम करता है। एक बार फिर धन्यवाद। उपर्युक्त प्रश्न पर

समाधान:

Components.utils.import("resource://gre/modules/AddonManager.jsm"); 
    Components.utils.import("resource://gre/modules/FileUtils.jsm"); 
    AddonManager.getAddonByID("plugin_id", function(addon) { 

    var uri = addon.getResourceURI("config.json"); 
    var file = Components.classes["@mozilla.org/file/local;1"] 
         .createInstance(Components.interfaces.nsILocalFile); 
    var stringUri = uri.asciiSpec; 
    stringUri = stringUri.replace(new RegExp(/\//g), '\\'); 
    stringUri = stringUri.slice(8); 
    alert(stringUri); 
    file.initWithPath(stringUri); 
    alert(addon.hasResource("config.json")); 

    var stream = FileUtils.openFileOutputStream(file, 
               FileUtils.MODE_WRONLY 
               | FileUtils.MODE_CREATE 
               | FileUtils.MODE_TRUNCATE); 
    stream.write(dataToWrite, dataToWrite.length); 
    stream.close(); 
+1

मुझे लगता है कि आप सुनिश्चित करें कि आपके एक्सटेंशन यह निर्देशिका स्थापित है करने के लिए फ़ाइलों लिखने के लिए अनपैक किया है की आवश्यकता होगी। – erikvold

+0

ताकि आप फ़ाइल को उपयोगकर्ता की प्रोफाइल निर्देशिका में सहेजना चाहें। – erikvold

उत्तर

2

फ़ायरफ़ॉक्स 4 के साथ शुरू आप उपयोग कर किया जाना चाहिए Add-on Manager API:

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

AddonManager.getAddonByID(id, function(addon) 
{ 
    var uri = addon.getResourceURI("config.json"); 
    if (uri instanceof Components.interfaces.nsIFileURL) 
    writeToFile(uri.file); 
}); 

ध्यान दें कि नई एपीआई अतुल्यकालिक है, एक विस्तार के बारे में डेटा प्राप्त करने में समय लग सकता है। साथ ही, आपको अपने install.rdf में <em:unpack>true</em:unpack> flag निर्दिष्ट करना होगा, अन्यथा आपका एक्सटेंशन इंस्टॉलेशन (प्रदर्शन कारणों से) पर अनपॅक नहीं किया जाएगा और config.json से संबंधित डिस्क पर कोई फ़ाइल नहीं होगी (यह पैक की गई XPI फ़ाइल के अंदर एक स्थान होगी) । विस्तार निर्देशिका में लिखने के साथ एक और मुद्दा है: एक्सटेंशन अपडेट होने पर सभी फ़ाइलों को प्रतिस्थापित किया जाएगा। प्रोफाइल निर्देशिका में एक फ़ाइल को एक बेहतर विचार लिखा जा सकता है, तो आपको प्रदर्शन बलिदान की आवश्यकता नहीं होगी।

एक फ़ाइल FileUtils.jsm का उपयोग कर सरल किया जा सकता करने के लिए लेखन:

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

var stream = FileOutputStream.openFileOutputStream(file, FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE); 
stream.write(data, data.length); 
stream.close(); 
0

फ़ायरफ़ॉक्स 4 Add-on Manager के पक्ष में nsIExtensionManager के उपयोग बदल दिया।

Components.utils.import("resource://gre/modules/Services.jsm"); 
Services.dirsvc.get("ProfD", Ci.nsILocalFile) 

यह शायद यहाँ अपनी फ़ाइल को बचाने के लिए एक बेहतर विचार है, लेकिन मैं डॉन:

तो तुम बजाय एफएफ> = 4

0

आप के साथ उपयोगकर्ता के प्रोफ़ाइल निर्देशिका पा सकते हैं के लिए Add-on Manager का उपयोग करना चाहिए संदर्भ नहीं पता।

संबंधित मुद्दे