1

私はWindowsStoreApps(Microsoftがそれを呼んでいるもの)の発見を始めたばかりで、FolderPickerの使用に関するサンプルコードに従っます

フォルダを繰り返し処理して、すべてのサブフォルダとファイルを読みたいです。

私が見た2つの機能が必要だと思いましたが、何時間も試してみると正しく実行できません。

上記のリンクで、次のような行があります。

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

アップデート:

私は苦労してきましたが、フォルダとサブフォルダを繰り返している間、物事を整理することができません。

@Damirのコードは最も深いフォルダを掘り下げません。再帰関数が必要です。私は次の機能を思い付くことができましたが、私が言ったように結果は整理されていません

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

1 に答える 1

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

ここからは、ファイルのパスを印刷するだけでなく、ファイルのフラットリストを必要なものに変換できます。

于 2012-12-22T05:59:42.190 に答える