gpt4 book ai didi

javascript - 如何找到 Google 云端硬盘文件的整个父文件夹层次结构?

转载 作者:行者123 更新时间:2023-11-30 20:30:17 25 4
gpt4 key购买 nike

我可以使用 Google Drive API 来执行此操作:

drive.files.get(
{
fields: "parents",
fileId: "######"
},
(err, results) => {
...
}
);

但是,我只能获取文件夹的 ID,比文件高一级。

如何获取包含 Google 云端硬盘文件的父文件夹、包含该文件夹的文件夹、包含该文件夹的文件夹等的整个层次结构?

最佳答案

这个方法怎么样?我认为您的情况有几种解决方案。因此,请将此视为其中之一。遗憾的是,无法使用 Drive API 的 files.get 检索文件夹中的所有文件夹(包括子文件夹)。当 q 用于 Drive API 的 files.list 时,'folder ID' in parents 仅检索文件夹 ID 中的文件夹。无法检索文件夹 ID 中子文件夹下的文件夹。所以在这个方法中,我使用了下面的流程。

  1. 检索 Google 云端硬盘中的所有文件夹。
    • 在此示例脚本中,如果您的 Google Drive 中的文件夹数量少于 1000,则所有文件夹都将通过一次 API 调用检索。如果文件夹数量为 1000 到 2000,则使用 2 次 API 调用。
  2. 使用所有文件夹的列表创建文件夹树。

示例脚本:

function run(auth) {
var drive = google.drive({version: 'v3', auth: auth});
getFolderTree(drive, "", []);
}

function getFolderTree(drive, nextPageToken, folderList) {
drive.files.list({
pageToken: nextPageToken ? nextPageToken : "",
pageSize: 1000,
q: "mimeType='application/vnd.google-apps.folder'",
fields: "files(id,parents),nextPageToken",
}, (err, {data}) => {
if (err) return console.log('The API returned an error: ' + err);
const token = data.nextPageToken;
Array.prototype.push.apply(folderList, data.files);
if (token) {
getFolderTree(drive, token, folderList);
} else {

// This script retrieves all folders including subfolders under this folder ID.
const folderId = "### Top folder ID ###";

const folderTree = function c(folder, folderSt, res) {
let ar = folderList.filter(e => e.parents[0] == folder);
folderSt += folder + "#_aabbccddee_#";
let arrayFolderSt = folderSt.split("#_aabbccddee_#");
arrayFolderSt.pop();
res.push(arrayFolderSt);
ar.length == 0 && (folderSt = "");
ar.forEach(e => c(e.id, folderSt, res));
return res;
}(folderId, "", []);

// Output the folder tree.
console.log(folderTree);
}
});
}

输出:

当文件夹结构如下。 (您可以在此示例脚本中设置顶级文件夹 ID。)

enter image description here

此脚本创建一个数组,如下所示。

[
['topFolderId'],
['topFolderId','folderId_2a'],
['topFolderId','folderId_2b'],
['topFolderId','folderId_2b','folderId_3a'],
['topFolderId','folderId_2b','folderId_3b']
]

注意事项:

  • 我确认此示例脚本适用于 v30.0.0 的 googleapis。
  • 通常,文件夹树是通过从顶级文件夹中按顺序检索文件夹来创建的。但是对于这种情况使用Drive API时,如果top folder中的文件夹很多,需要调用很多API。因此,在这种方法中,我尝试使用所有文件夹的列表通过少量 API 调用创建文件夹树。
  • 这是一个简单的示例脚本,因此请根据您的环境修改它。

引用:

编辑:

此更新后的脚本会检索整个文件夹树,包括输入的文件夹 ID。对于上述脚本,修改了 run()getFolderTree()

function run(auth) {
var drive = google.drive({version: 'v3', auth: auth});
drive.files.get({fileId: "root", fields: "id"}, (err, {data}) => {
getFolderTree(drive, "", [], data.id);
});
}

function getFolderTree(drive, nextPageToken, folderList, rootId) {
drive.files.list({
pageToken: nextPageToken ? nextPageToken : "",
pageSize: 1000,
q: "mimeType='application/vnd.google-apps.folder'",
fields: "files(id,name,parents),nextPageToken",
}, (err, {data}) => {
if (err) return console.log('The API returned an error: ' + err);
const token = data.nextPageToken;
Array.prototype.push.apply(folderList, data.files);
if (token) {
getFolderTree(drive, token, folderList, rootId);
} else {

// Please input folder ID.
const inputId = "### Folder ID ###";

const folderId = rootId;
const folderTree = function c(folder, folderSt, res) {
let ar = folderList.filter(e => e.parents[0] == folder);
folderSt += folder + "#_aabbccddee_#";
let arrayFolderSt = folderSt.split("#_aabbccddee_#");
arrayFolderSt.pop();
res.push(arrayFolderSt);
ar.length == 0 && (folderSt = "");
ar.forEach(e => c(e.id, folderSt, res));
return res;
}(folderId, "", []);
let result = folderTree.filter(e => ~e.indexOf(inputId));
if (result.length > 2) result.shift();

// Output result.
console.log(result);
}
});
}

如上,当folderId_2b输入到inputId时,可以得到如下结果。

[
["topFolderId","folderId_2b","folderId_3a"],
["topFolderId","folderId_2b","folderId_3b"]
]

关于javascript - 如何找到 Google 云端硬盘文件的整个父文件夹层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50416340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com