2014-10-10 72 views

回答

4

是的,有這樣的一個簡單的方法。正常的方法是使用nsIFilePicker

與該頁上的示例的主要區別在於傳遞給init()方法的參數中,指定nsIFilePicker.modeGetFoldermode。另外,鑑於您正在查找目錄,您只想包含nsIFilePicker.filterAll過濾器,而不是針對特定擴展類型的過濾器。從MDN頁

實施例的代碼,修改用於拾取文件夾(以及給出說明性的變量名):

if (window === null || typeof window !== "object") { 
    //If you do not already have a window reference, you need to obtain one: 
    // Add a "/" to un-comment the version appropriate for your environment. 

    /* Add-on SDK environment: 
    var window = require('sdk/window/utils').getMostRecentBrowserWindow(); 
    //*/ 

    /* Overlay and bootstrap environments (from almost any context/scope): 
    var window = Components.classes["@mozilla.org/appshell/window-mediator;1"] 
          .getService(Components.interfaces.nsIWindowMediator) 
          .getMostRecentWindow("navigator:browser"); 
    //*/ 
} 


const nsIFilePicker = Components.interfaces.nsIFilePicker; 

var filePicker = Components.classes["@mozilla.org/filepicker;1"] 
       .createInstance(nsIFilePicker); 
filePicker.init(window, "Dialog Title", nsIFilePicker.modeGetFolder); 
filePicker.appendFilters(nsIFilePicker.filterAll); 

var pickerStatus = filePicker.show(); 
if (pickerStatus == nsIFilePicker.returnOK 
    || pickerStatus == nsIFilePicker.returnReplace 
) { 
    var file = filePicker.file; 
    // Get the path as string. Note that you usually won't 
    // need to work with the string paths. 
    var path = filePicker.file.path; 
    // work with returned nsILocalFile... 
} 
+1

我不得不以獲得窗口:'VAR窗口=要求(「SDK /窗/ utils的」 ).getMostRecentBrowserWindow();'然後一切正常,謝謝! – 2014-10-10 15:30:48

+1

謝謝你提醒我。我添加了一些代碼,可以在所有三種類型的附加環境中工作,以獲得最新的瀏覽器窗口。您能否花些時間驗證我添加的代碼在Add-on SDK環境中的作用?它應該可以在所有覆蓋層,引導程序和附加SDK中工作,但是很高興知道它在插件SDK環境中確實可行(已在其他測試中進行了測試)。謝謝。 – Makyen 2014-10-10 16:09:52

+0

既然你使用'Components' CFX是不爽: 」 ......要做到這一點,你需要添加 線有點類似如下: 常量{抄送詞} =要求(‘鉻’);. ..' 我ususally嘗試避免'{...}'語法,因爲我停止驗證我的JavaScript的Eclipse,但我認爲大多數人將有快捷鍵(抄送,Ci)等可用,所以你可以使用它們。 – 2014-10-10 16:14:29