Windows 8 如何使用JavaScript递归读取文件和文件夹

Windows 8 如何使用JavaScript递归读取文件和文件夹,windows-8,windows-store-apps,winjs,Windows 8,Windows Store Apps,Winjs,我刚刚开始发现Windows StoreApps(微软就是这么称呼它的),下面是关于使用FolderPicker的示例代码 我想遍历文件夹并读取所有子文件夹和文件 有两个功能我已经看过了,我认为是我需要的,但我不能做后,尝试了几个小时正确 在上面的链接中,该行表示: WinJS.log && WinJS.log("Picked folder: " + folder.name, "sample", "status"); 我试图在文件夹中更深入地挖掘,比如: folder.getF

我刚刚开始发现Windows StoreApps(微软就是这么称呼它的),下面是关于使用FolderPicker的示例代码

我想遍历文件夹并读取所有子文件夹和文件

有两个功能我已经看过了,我认为是我需要的,但我不能做后,尝试了几个小时正确

在上面的链接中,该行表示:

WinJS.log && WinJS.log("Picked folder: " + folder.name, "sample", "status");
我试图在文件夹中更深入地挖掘,比如:

folder.getFoldersAsync().then(函数(folderItem){
document.getElementById('musicFolder')。innerHTML+=folderItem.length+“文件夹”)
; folderItem.forEach(函数(x){ document.getElementById('musicFolder').innerHTML+=“--”+x.name+“
”; x、 GetFileAsync().then(函数(项){ document.getElementById('musicFolder')。innerHTML+=items.length+“files”+“
”; }); }); });
更新:

我一直在努力,但在迭代文件夹和子文件夹时无法组织这些内容

@Damir的代码无法挖掘最深的文件夹。我们需要一个递归函数。我可以想出以下函数,但正如我所说的,结果是没有组织的

函数扫描文件夹(文件夹){
var isInc=假;
folder.getFoldersAsync().then(函数(folderItem){
如果(folderItem.length>0){
folderItem.forEach(函数(x){
如果(!isInc){
isInc=真;
连字符+=“-”;
}
document.getElementById('musicFolder')。innerHTML+=hyphen+x.name+“
”; x、 GetFileAsync().then(函数(项){ items.forEach(功能(项目){ 推({ 名称:item.name, 路径:item.path }); document.getElementById('musicFolder')。innerHTML+=hyphen+“-”+item.name+“
”; }); }).done(函数(){ 扫描文件夹(x); }); }); } }); }
是否要读取所有子文件夹及其内的文件?像这样的方法应该会奏效:

folder.getFoldersAsync().then(function (folderItem) {
    document.getElementById('musicFolder').innerHTML += "(" + folderItem.length + " folders)<br/>";
    folderItem.forEach(function (x) {
        x.getFilesAsync().then(function (items) {
            document.getElementById('musicFolder').innerHTML += "--" + x.name + " (" + items.length + " files)<br>";
            items.forEach(function(item) {
                document.getElementById('musicFolder').innerHTML += "----" + item.name + "<br>";
            });
        });
    });
});
folder.getFoldersAsync().then(函数(folderItem){
document.getElementById('musicFolder').innerHTML+=“(“+folderItem.length+”文件夹)
”; folderItem.forEach(函数(x){ x、 GetFileAsync().then(函数(项){ document.getElementById('musicFolder').innerHTML+=“--”+x.name+”(“+items.length+”文件)
”; items.forEach(功能(项目){ document.getElementById('musicFolder')。innerHTML+=“----”+item.name+“
”; }); }); }); });
编辑:

在WinRT中,实际上不需要递归地扫描文件夹及其子文件夹。您可以改为使用:

var options=new Windows.Storage.Search.QueryOptions(Windows.Storage.Search.CommonFileQuery.defaultQuery,['*');
options.folderDepth=Windows.Storage.Search.folderDepth.deep;
folder.createFileQueryWithOptions(选项).getFileAsync().then(函数(文件){
var路径=新数组();
forEach(函数(文件){
push(file.path);
});
path.sort();
forEach(函数(路径){
document.getElementById('musicFolder')。innerHTML+=path+“
”; }); });

从这里开始,您可以将文件的平面列表转换为您需要的任何文件,而不只是打印它们的路径。

Hi receive@Damir Arh,感谢您让我走上正轨。请查看我更新的问题。@JeyKeu对此表示抱歉。我没有注意到您正在寻找子文件夹的递归扫描。我用它玩了一点,但我对Javascript或承诺链了解不够,无法让它工作。也许你最好打开一个新问题,因为这个问题可能不会因为一个被接受的答案而吸引太多的注意力。@JeyKeu我偶然在WinRT中找到了一个方法,它可以为你进行递归扫描,所以你不需要再在代码中使用递归了。见我上面的例子。
var options = new Windows.Storage.Search.QueryOptions(Windows.Storage.Search.CommonFileQuery.defaultQuery, ['*']);
options.folderDepth = Windows.Storage.Search.FolderDepth.deep;
folder.createFileQueryWithOptions(options).getFilesAsync().then(function (files) {
    var paths = new Array();
    files.forEach(function(file) {
        paths.push(file.path);
    });
    paths.sort();
    paths.forEach(function(path) {
        document.getElementById('musicFolder').innerHTML += path + "<br>";
    });
});