使用GraphServiceClient在OneDriveForBusiness中创建嵌套目录

问题描述 投票:3回答:2

我一直在尝试利用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;

即使它适用于某些修复,不确定它是否是最佳方式,建议将不胜感激。

c# azure microsoft-graph azure-ad-graph-api
2个回答
2
投票

但在上传文件之前提供路径时,寻找创建文件夹层次结构的方法。

根据我的经验,目前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团队。


1
投票

我做了一个小功能来做到这一点。

虽然使用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");
© www.soinside.com 2019 - 2024. All rights reserved.