Windows 8 如何使用JavaScript递归读取文件和文件夹
我刚刚开始发现Windows StoreApps(微软就是这么称呼它的),下面是关于使用FolderPicker的示例代码 我想遍历文件夹并读取所有子文件夹和文件 有两个功能我已经看过了,我认为是我需要的,但我不能做后,尝试了几个小时正确 在上面的链接中,该行表示: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
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>";
});
});