使用 Google Drive API [C# / .NET] 获取文件夹层次结构
Get folder hierarchy with Google Drive API [C# / .NET]
我正在寻找一种优雅的方式来获取文件夹层次结构,从我的根文件夹开始,使用 C# Google Drive API V3。
目前,您可以通过
获取根文件夹及其父文件夹
var getRequest = driveService.Files.Get("root");
getRequest.Fields = "parents";
var file = getRequest.Execute();
但我正在寻找一种获取子项而不是父项的方法,因此我可以递归地查看文件结构。
设置 getRequest.Fields = 'children'
不是有效的字段选项。
递归获取 children 是获取完整层次结构的一种非常耗时的方法。更好的方法是 运行 查询以在单个 GET 中获取所有文件夹(如果您有超过 1,000 个文件夹,则可能需要多个文件夹)然后遍历它们的 parent 属性以构建层次结构在记忆中。请记住,(afaik)没有什么可以阻止文件夹层次结构循环,因此 folder1 拥有 folder2 拥有 folder3 拥有 folder1,因此无论您采用哪种策略,请检查您是否处于循环中。
如果您是 GDrive 的新手,请务必尽早意识到文件夹只是标签,而不是容器。因此具有多个 parent 的循环关系和文件是很正常的。它们最初被称为 Collections,但被重命名为文件夹以安抚那些无法理解标签的社区成员。
希望这就是您要找的答案。 getHeirarchy
递归挖掘 Google 驱动器并将文件标题存储到文本文件中。
public System.IO.StreamWriter w = new System.IO.StreamWriter("Hierarchy.txt", false);
string intend = " ";
private void getHierarchy(Google.Apis.Drive.v2.Data.File Res, DriveService driveService)
{
if (Res.MimeType == "application/vnd.google-apps.folder")
{
w.Write(intend + Res.Title + " :" + Environment.NewLine);
intend += " ";
foreach (var res in ResFromFolder(driveService, Res.Id).ToList())
getHierarchy(res, driveService);
intend = intend.Remove(intend.Length - 5);
}
else
{
w.Write(intend + Res.Title + Environment.NewLine);
}
}
您可以像这样调用该函数:
w.Write("My Drive:" + Environment.NewLine);
foreach (var Res in ResFromFolder(driveService, "root").ToList())
getHierarchy(Res, driveService);
w.Close();
在这里,root
可以替换为任何目录的 ID 以获取其结构。这将生成整个驱动器的结构。
ResFromFolder
方法 returns 目录中包含 Google.Apis.Drive.v2.Data.File
元数据的列表。
public List<Google.Apis.Drive.v2.Data.File> ResFromFolder(DriveService service, string folderId)
{
var request = service.Children.List(folderId);
request.MaxResults = 1000;
List<Google.Apis.Drive.v2.Data.File> TList = new List<Google.Apis.Drive.v2.Data.File>();
do
{
var children = request.Execute();
foreach (ChildReference child in children.Items)
{
TList.Add(service.Files.Get(child.Id).Execute());
}
request.PageToken = children.NextPageToken;
} while (!String.IsNullOrEmpty(request.PageToken));
return TList;
}
此代码产生类似于
的输出
但是正如pinoyyid提到的,如果Drive包含大量文件和文件夹,它确实会消耗大量时间。
Get folder hierarchy with Google Drive API [C# / .NET]
Google.Apis.Drive.v3.DriveService service = GetService();
List<GoogleDriveFile> folderList = new List<GoogleDriveFile>();
Google.Apis.Drive.v3.FilesResource.ListRequest request = service.Files.List();
//https://developers.google.com/drenter code hereive/api/v3/search-shareddrives
request.Q = string.Format("mimeType='application/vnd.google-apps.folder' and '{0}' in parents", folderId)`enter code here`;
request.Fields = "files(id, name)";
Google.Apis.Drive.v3.Data.FileList result = request.Execute();
foreach (var file in result.Files)
{
GoogleDriveFile googleDriveFile = new GoogleDriveFile
{
Id = file.Id,
Name = file.Name,
Size = file.Size,
Version = file.Version,
CreatedTime = file.CreatedTime,
Parents = file.Parents
};
folderList.Add(googleDriveFile);
}
return folderList;
我正在寻找一种优雅的方式来获取文件夹层次结构,从我的根文件夹开始,使用 C# Google Drive API V3。
目前,您可以通过
获取根文件夹及其父文件夹var getRequest = driveService.Files.Get("root");
getRequest.Fields = "parents";
var file = getRequest.Execute();
但我正在寻找一种获取子项而不是父项的方法,因此我可以递归地查看文件结构。
设置 getRequest.Fields = 'children'
不是有效的字段选项。
递归获取 children 是获取完整层次结构的一种非常耗时的方法。更好的方法是 运行 查询以在单个 GET 中获取所有文件夹(如果您有超过 1,000 个文件夹,则可能需要多个文件夹)然后遍历它们的 parent 属性以构建层次结构在记忆中。请记住,(afaik)没有什么可以阻止文件夹层次结构循环,因此 folder1 拥有 folder2 拥有 folder3 拥有 folder1,因此无论您采用哪种策略,请检查您是否处于循环中。
如果您是 GDrive 的新手,请务必尽早意识到文件夹只是标签,而不是容器。因此具有多个 parent 的循环关系和文件是很正常的。它们最初被称为 Collections,但被重命名为文件夹以安抚那些无法理解标签的社区成员。
希望这就是您要找的答案。 getHeirarchy
递归挖掘 Google 驱动器并将文件标题存储到文本文件中。
public System.IO.StreamWriter w = new System.IO.StreamWriter("Hierarchy.txt", false);
string intend = " ";
private void getHierarchy(Google.Apis.Drive.v2.Data.File Res, DriveService driveService)
{
if (Res.MimeType == "application/vnd.google-apps.folder")
{
w.Write(intend + Res.Title + " :" + Environment.NewLine);
intend += " ";
foreach (var res in ResFromFolder(driveService, Res.Id).ToList())
getHierarchy(res, driveService);
intend = intend.Remove(intend.Length - 5);
}
else
{
w.Write(intend + Res.Title + Environment.NewLine);
}
}
您可以像这样调用该函数:
w.Write("My Drive:" + Environment.NewLine);
foreach (var Res in ResFromFolder(driveService, "root").ToList())
getHierarchy(Res, driveService);
w.Close();
在这里,root
可以替换为任何目录的 ID 以获取其结构。这将生成整个驱动器的结构。
ResFromFolder
方法 returns 目录中包含 Google.Apis.Drive.v2.Data.File
元数据的列表。
public List<Google.Apis.Drive.v2.Data.File> ResFromFolder(DriveService service, string folderId)
{
var request = service.Children.List(folderId);
request.MaxResults = 1000;
List<Google.Apis.Drive.v2.Data.File> TList = new List<Google.Apis.Drive.v2.Data.File>();
do
{
var children = request.Execute();
foreach (ChildReference child in children.Items)
{
TList.Add(service.Files.Get(child.Id).Execute());
}
request.PageToken = children.NextPageToken;
} while (!String.IsNullOrEmpty(request.PageToken));
return TList;
}
此代码产生类似于
的输出但是正如pinoyyid提到的,如果Drive包含大量文件和文件夹,它确实会消耗大量时间。
Get folder hierarchy with Google Drive API [C# / .NET]
Google.Apis.Drive.v3.DriveService service = GetService();
List<GoogleDriveFile> folderList = new List<GoogleDriveFile>();
Google.Apis.Drive.v3.FilesResource.ListRequest request = service.Files.List();
//https://developers.google.com/drenter code hereive/api/v3/search-shareddrives
request.Q = string.Format("mimeType='application/vnd.google-apps.folder' and '{0}' in parents", folderId)`enter code here`;
request.Fields = "files(id, name)";
Google.Apis.Drive.v3.Data.FileList result = request.Execute();
foreach (var file in result.Files)
{
GoogleDriveFile googleDriveFile = new GoogleDriveFile
{
Id = file.Id,
Name = file.Name,
Size = file.Size,
Version = file.Version,
CreatedTime = file.CreatedTime,
Parents = file.Parents
};
folderList.Add(googleDriveFile);
}
return folderList;