我一直在尝试利用Microsoft Graph Api与MVC Web应用程序内的用户一个驱动器业务进行通信,使用委派权限设置所有内容,并且可以在登录用户的ODB中读取和写入数据,但是有什么方法可以通过可以创建嵌套文件夹或目录结构吗?
目前我使用下面的代码在用户的ODB的根目录中创建文件夹并且工作正常,但是在上传文件之前提供路径时寻找创建文件夹层次结构的方法。
DriveItem rootDirectory = graphServiceClient.Me.Drive.Root.Children.Request().AddAsync(new DriveItem
{
Name = "RootDirectory",
Folder = new Folder(),
}).Result;
而对于RootDirectory中的另一个文件夹尝试这个但似乎不起作用(其中rootDirectory是上面创建的对象)
DriveItem subDirectory = graphServiceClient.Me.Drive.Root.Children.Request().AddAsync(new DriveItem
{
Name = "SubDirectory",
Folder = rootDirectory.Folder
}).Result;
即使它适用于某些修复,不确定它是否是最佳方式,建议将不胜感激。
但在上传文件之前提供路径时,寻找创建文件夹层次结构的方法。
根据我的经验,目前graphServiceClient不支持hierarchy of the folders
。
如果要创建子文件夹,则需要父文件夹存在。
作为解决方法,我们可以使用以下代码创建子文件夹。您还可以创建一个递归函数来创建嵌套函数
var folder= graphserviceClient.Me.Drive.Root.Children.Request()
.AddAsync(new DriveItem
{
Name = "tomfolder",
Folder = new Folder()
}).Result;
var subfolder = graphserviceClient.Me.Drive.Items[folder.Id].Children.Request()
.AddAsync(new DriveItem
{
Name = "subfolder",
Folder = new Folder()}
).Result;
你也可以give your good ideas到azure团队。
我做了一个小功能来做到这一点。
虽然使用try-catch确实不是最佳实践,但最终我认为它比为子进程递归地轮询每个文件夹更好,然后在路径的一部分存在的情况下按名称查找。
public async Task CreateFolder(string foldername)
{
string[] splitted = foldername.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries);
var f = graphServiceClient.Me.Drive.Root;
string p = "";
IDriveItemRequestBuilder b;
DriveItem driveItem;
foreach (string folder in splitted)
{
p = string.Format("{0}{1}{2}", p, string.IsNullOrEmpty(p) ? "" : "/", folder);
b = graphServiceClient.Me.Drive.Root.ItemWithPath(p);
try
{
driveItem = await b.Request().GetAsync();
}
catch
{
driveItem = null;
}
if (driveItem == null)
{
var f2 = await f.Children.Request().AddAsync(new DriveItem()
{
Name = folder,
Folder = new Folder()
});
b = graphServiceClient.Me.Drive.Root.ItemWithPath(p);
}
f = b;
}
}
你打电话是这样的:
await CreateFolder("folder1/folder2/folder3");