列出OneDrive目录内容而不递归到子目录

时间:2015-02-20 21:06:25

标签: javascript node.js recursion onedrive

由于当时微软赠送100GB + 100GB并且我已经免费获得一些GB,我曾尝试将此空间用作下载文件的媒体存储目录来自我的VPS。

215GB

所以我开始使用Node.JS阅读OneDrive REST Docs以进行身份​​验证,我成功了。

我能够:

  • 随时登录和访问(使用访问令牌和刷新令牌)
  • 上传,修改,删除文件
  • 创建,编辑,删除目录
  • 列出目录内容

所有这一切都使用REST API。

问题在于,由于这些OneDrive REST API的一些重复,我必须遍历目录以检测其内容(进行N次调用,具体取决于文件夹的深度),而不是一次性请求所需的目录。 / p>

我只是想为OneDrive开发ls之类的命令来完成我的VPS-OneDrive同步项目。

到目前为止,这是我的代码:

function lsdir(path, originalpath, folder, callback) {
    dirs = path.split("/");
    if (folder == null) {
        originalpath = path;
        request("https://apis.live.net/v5.0/me/skydrive?access_token=" + at, function(err, res, body) {
            var json = JSON.parse(body);
            var upload_location = json.upload_location;

            request(upload_location + "?access_token=" + at, function(err, res, body) {
                //console.log(body);
                json = JSON.parse(body);
                var found = false;
                if (originalpath == "/") {
                    callback(json, originalpath);
                    return;
                }
                for (i in json.data) {
                    currentFolder = json.data[i];

                    if (currentFolder.name == dirs[1]) {
                        found = currentFolder;
                        if (dirs.length > 2) {
                            lsdir(dirs.slice(2, dirs.length).join("/"), originalpath, currentFolder, callback);
                        } else {
                            callback(currentFolder, originalpath);
                            return;
                        }
                        break;
                    }
                }
            });
        });
    } else if (dirs.length > 0) {
        request(folder.upload_location + "/?access_token=" + at, function(err, res, body) {
            json = JSON.parse(body);
            var found = false;
            if (dirs.length == 1) {
                callback(json, originalpath);
            } else {
                for (i in json.data) {
                    currentFolder = json.data[i];

                    if (currentFolder.name == dirs[0]) {
                        lsdir(dirs.slice(1, dirs.length).join("/"), originalpath, currentFolder, callback);
                        break;
                    }
                }
            }

        });
    }
}

lsdir("/vpsSync/", null, null, function(folder, originalpath) {
            console.log(("Directory contents of " + originalpath).bold);
            console.log(folder.data.map(function(arr) {
                if (arr.type == "folder") {
                    return arr.name + "/";
                }
                return arr.name;
            }).join("\n"));
        });

有没有办法减少递归(或完全删除它)? Micro $ ft服务器非常慢(每个请求3-5秒!)

谢谢大家,享受215GB的OneDrive:)

1 个答案:

答案 0 :(得分:2)

您可能需要考虑使用我们刚刚公布的API,它可以进行同步。

http://onedrive.github.io/items/view_changes.htm

如果从要开始遍历层次结构的点开始同步操作,并且不提供令牌,则应返回完整视图。对于较大的层次结构,您仍然需要发出多个请求(基于“@ changes.hasMorechanges”和“@ odata.nextLink”的值),但这仍然远远少于每个文件夹一个。