创建单个文件/文件夹并立即使用它们的 ID? 谷歌云端硬盘 API

如何解决创建单个文件/文件夹并立即使用它们的 ID? 谷歌云端硬盘 API

问题的简短版本:

使用 Javascript,我想在结构中创建文件夹,确认是否存在任何/全部/不存在的文件夹。因此,给定文件名称“A”、“B”、“C”和“D”,创建“A”,将其放入根目录,然后创建“B”,并将其放入“A”,依此类推。问题是,无论我如何构造它,所有文件夹都是异步插入的,这意味着它们没有各自的 ParentId,而且它们都以根目录结束。

带有 WIP 的长版:

我正在尝试一次创建三个(或更多)文件夹,它们都在同一路径上。

例如,如果我希望文件路径为 State\City\Street。我首先将文件夹按所需顺序排列在一个数组中(请注意,在我的最终项目中,这些文件夹不会被硬编码,而是根据他们正在查看的用户和 salesforce 记录动态命名)。

const filePath = ["State","City","Street"];

然后我将它传递给这个方法,该方法假设一次创建一个文件夹,使用前一个文件夹的 Id 作为它的 parentId。

        function createFolder() {

            var parentFolderId = "root";

            for (let i = 0; i < filePath.length; i++) {

                    var folderMetadata = {
                        'name' : filePath[i],'mimeType' : 'application/vnd.google-apps.folder','parents': [parentFolderId]
                    }
                    gapi.client.drive.files.create({
                        resource: folderMetadata,}).then(function(response) {
                        switch(response.status){
                            case 200:
                                var file = response.result;
                                parentFolderId = file.Id;
                                console.log(i + ' file.Id= ' + file.Id);
                                break;
                            default:
                                console.log('Error creating the folder,' + response);
                                break;
                        }
                    });
             }
        }

但是,所有文件夹都是在函数完成后,在“parentFolderId = file.Id;”之前创建的line 运行,所以它们都被放入 root。

我意识到我可以创建所有文件夹,查询它们,然后重新排列它们。但是,我项目的下一部分是动态确定这些文件夹中的任何一个/所有文件夹是否已经存在,并且文件夹结构可能会有很大差异。

解决方法

好的,稍微调整一下,@Alessandro 在 this question 上的解决方案对我有用:

  • 为了便于阅读,我颠倒了方法的顺序。
  • 我合并了一个 FOR 循环,因为我的文件结构将包含许多文件夹。循环是通过包含文件路径中文件夹名称的字符串数组。
  • 我注意到 (!parent) 没有正确返回,因为它是“未定义”,而不是“空”。此外,当找不到现有文件夹时期望“null”是至关重要的,所以我默认 parentId 为“root”,因为我知道我的第一个文件夹将始终位于根目录
  • 变量 newFolderId 保存找到/创建的文件夹的值,并传递到 parentId 以供 FOR 循环的下一次迭代
  • 最后,我将“'parent':parent”更新为“'parents':[parent]”。那个“s”和那些括号似乎是必要的,否则每个创建的文件夹都放在根目录下。
        async function buildFilePath() {

            console.log("buildFilePath()");

            var parentId = "root";

            for (let i = 0; i < filePath.length; i++)  {
                var folderName = filePath[i];

                newFolderId = await getFolder(folderName,parentId);
                console.log(folderName + " id is " + newFolderId + ",parentId is " + parentId);
                if (newFolderId == null) {
                    newFolderId = await createFolder(folderName,parentId);
                    console.log ("created new folder " + folderName + " with Id " + parentId);
                } else {
                    // parentId = newParentId;
                    console.log (folderName + " already exist,move on to next.");
                }
                parentId = newFolderId;
            }
        }
        async function getFolder(name,parent) {

            const res = await gapi.client.drive.files.list({
                'pageSize': 1,'fields': "nextPageToken,files(id,name,mimeType,parents)",'q': "mimeType='application/vnd.google-apps.folder' \
                            and '" + parent + "' in parents \
                            and name = '" + name + "' \
                            and trashed = false"
            });
            return res.result.files.length > 0 ? res.result.files[0]['id'] : null;
        }
        async function createFolder(name,parent) {

            if (!parent) parent = 'root';

            var fileMetadata = {
                'name': name,'mimeType': 'application/vnd.google-apps.folder','parents': [parent]
            };
            const res = await gapi.client.drive.files.create({
                'resource': fileMetadata,'fields': 'id'
            });
            return res.result['id'];
        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?