2013-06-20 88 views
2

我想讀的所有在指定目錄是通過使用用戶選擇的目錄中唯一的第一級目錄:一旦用戶選擇了所需的文件夾閱讀的JavaScript

<input type="file" id="directory-chooser" webkitdirectory directory/> 

。我可以用獲取的所有文件:

var files = document.getElementById('directory-chooser').files; 
console.log(files); 

的這個輸出是的形式:

2: File 
    lastModifiedDate: Mon Jun 17 2013 17:55:45 GMT+0100 (BST) 
    name: "." 
    size: 68 
    type: "" 
    webkitRelativePath: "Movies/Superman returns/." 
    length: 3 

如可以看出,在選擇名爲Movies的目錄,我得到的列表中的所有「文件」。但是,我只是想讓它停止查看子目錄並因此返回Superman returns。儘管我希望它繼續尋找更多的第一級目錄,如果有的話。

+0

jQuery的標籤是不相關的。 – Tommi

+0

也許你可以用「/」符號分割字符串 – Edorka

+0

@Edorka - 這是一種方式,但是這會導致不必要的重複(即它在文件夾中有多個文件),然後需要過濾掉重複的結果。我想知道是否有一個更簡單的方法來做到這一點。 – Namit

回答

1

您可以計算每個文件路徑中「/」的數量。如果用戶選擇一個文件夾「富」,返回文件的路徑將是:

foo/bar.txt 
foo/bar/baz.txt 
(...) 

因此,你只希望有一個斜線的文件(即它們直接是所選擇的目錄下,不在一個子目錄中)。

這裏的HTML代碼:

<input type="file" id="directory-chooser" webkitdirectory directory/> 
<input type="button" value="files" onclick="showFiles()"> 

和這裏的JS代碼:

function showFiles() { 
    var files = document.getElementById('directory-chooser').files; 
    for (i = 0; i < files.length; i++) { 
     if (files[i].webkitRelativePath.match(/\//g).length == 1) { 
      // The file in question is not in a subfolder, so show it 
      console.log(files[i]); 
     } 
    } 
} 

最後,這裏有一個工作的jsfiddle:

http://jsfiddle.net/BHSDa/

+0

整體概念的主要問題是遞歸深度對我來說似乎是無限的。所以我可以選擇驅動器C:並將瀏覽器永久關閉。另外,我找不到任何方法來手動定義深度。我認爲這是OP要求的。 – Tommi

+0

這是真的,但我找不到在webkitdirectory文檔中指定深度的任何方式。 –

+2

這是一個小的優化:http://jsfiddle.net/78GXA/1/。由於使用寬度優先的樹/文件夾遍歷來生成文件列表,當您的文件夾深度超過1時,可以執行返回。通過這種方式,您不需要比根級更深的所有文件進行比較。不幸的是,由於Chrome代碼本身準備了文件列表,當您選擇巨型目錄時,無法停止/搶佔Chrome瀏覽器崩潰。除非有標誌指定深度,但正如菲利普斯目前在API中沒有這樣的選擇。 –