2012-12-21 70 views
1

我剛開始發現Windows StoreApps(這就是微軟稱之爲的),我正在關注使用FolderPicker的示例代碼here我如何遞歸閱讀使用JavaScript的文件和文件夾

我想遍歷文件夾並閱讀所有的子文件夾和文件。

我看過的功能有兩種,我認爲是我需要的,但在嘗試幾個小時後我無法正確完成。

在上面的鏈接,它說行:

WinJS.log && WinJS.log("Picked folder: " + folder.name, "sample", "status"); 

我試過的東西,如挖的文件夾中更深:

folder.getFoldersAsync().then(function (folderItem) { 
    document.getElementById('musicFolder').innerHTML += folderItem.length + " folders)<br/>"; 
    folderItem.forEach(function (x) { 
     document.getElementById('musicFolder').innerHTML += "--" + x.name + "<br/>"; 
     x.getFilesAsync().then(function (items) { 
      document.getElementById('musicFolder').innerHTML += items.length + " files"+"<br>"; 
     }); 
    }); 
}); 

UPDATE:

我有一直在掙扎,但無法在迭代文件夾和子文件夾時獲得組織的東西。

@達米爾的代碼不挖最深的文件夾。我們需要一個遞歸函數。我可以拿出以下功能,但正如我所說的結果沒有組織

function scanFolder(folder) { 
    var isInc = false; 
    folder.getFoldersAsync().then(function (folderItem) { 
     if (folderItem.length > 0) { 
      folderItem.forEach(function (x) { 
       if (!isInc) { 
        isInc = true; 
        hyphen += "-"; 
       } 
       document.getElementById('musicFolder').innerHTML += hyphen + x.name + "</br>"; 
       x.getFilesAsync().then(function (items) { 
        items.forEach(function (item) { 
         allTracks.push({ 
          name: item.name, 
          path: item.path 
         }); 
         document.getElementById('musicFolder').innerHTML += hyphen +"-"+ item.name + "</br>"; 
        }); 
       }).done(function() { 
        scanFolder(x); 
       }); 
      }); 
     } 
    }); 
} 

回答

3

你想閱讀所有的子文件夾和裏面的文件?像這樣的東西應該工作:

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>"; 
      }); 
     }); 
    }); 
}); 

編輯:

實際上,有沒有必要遞歸循環掃描的文件夾及其子文件夾WinRT中。您可以使用StorageFolder.CreateFileQueryWithOptions()代替:

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>"; 
    }); 
}); 

從這裏你可以轉換文件的平面列表到任何你需要的,而不是僅僅打印出自己的道路。

+0

再次@達米爾阿爾, 感謝您讓我走上正軌。 請查看我更新的問題。 –

+0

@JeyKeu對不起。我沒有注意到你正在尋找子文件夾的遞歸掃描。我玩了一些,但是我對Javascript或者承諾鏈接不足以使其工作還不夠了解。如果你提出一個新的問題,最好是這樣,因爲這個問題可能不會被一個被接受的答案所吸引。 –

+0

@JeyKeu我無意中遇到了WinRT中的一個方法,它爲您執行遞歸掃描,因此您不需要在代碼中再次使用遞歸。看我上面的例子。 –