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

时间:2018-08-28 16:18:30

标签: c# azure microsoft-graph azure-ad-graph-api

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

即使可以使用某些修复程序,也不确定它是否是最理想的解决方法,建议还是值得赞赏的。

3 个答案:

答案 0 :(得分:2)

  

但是在提供路径之前寻找一种方法来创建文件夹的层次结构,然后再将文件上传到其中。

根据我的经验,hierarchy of the folders目前不受graphServiceClient支持。

如果要创建子文件夹,则需要存在父文件夹。

作为一种解决方法,我们可以使用以下代码创建子文件夹。您还创建了一个 递归函数来创建嵌套函数

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组成天青团队。

答案 1 :(得分:1)

我做了一个小功能。

虽然确实没有使用try-catch的最佳做法,但最终,我认为它比递归地轮询每个文件夹的子文件夹更好,然后如果路径的一部分存在,则按名称查找。 / p>

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");

答案 2 :(得分:0)

我重新审视了 Pic Mickael 的答案,因为它对我不起作用(它只是创建了两个子文件夹)。

我所做的是创建路径的第一个文件夹,这样我就有了一个起始文件夹。 如果我不这样做,当我尝试使用空路径添加驱动器项目时,我会收到错误消息。

所以,让我们先创建一个根文件夹:

    private static void CreateRootFolder(GraphServiceClient gc, string rootFolder)
    {
        var root = gc
            .Drives[_driveId]
            .Root
            .Children
            .Request()
            .AddAsync(new DriveItem()
            {
                Name = rootFolder,
                Folder = new Microsoft.Graph.Folder(),
                AdditionalData = new Dictionary<string, object>
                {
                    {
                        "@microsoft.graph.conflictBehavior", "replace"
                    }
                }
            })
            .Result;
    }

当我有了第一个文件夹时,我可以遍历所有其他文件夹:

   private static void CreateSubFolders(GraphServiceClient gc, string rootFolder, string foldername)
    {
        string[] splitted = foldername.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries);
        string pathCompleto = rootFolder;
        
        foreach (string folder in splitted)
        {
            var driveItem = new DriveItem
            {
                Name = folder,
                Folder = new Microsoft.Graph.Folder(),
                AdditionalData = new Dictionary<string, object>
                {
                    {
                        "@microsoft.graph.conflictBehavior", "replace"
                    }
                }
            };

            var newFolder = gc
                .Drives[_driveId]
                .Root
                .ItemWithPath(pathCompleto)
                .Children
                .Request()
                .AddAsync(driveItem)
                .Result;

            pathCompleto = string.Format("{0}{1}{2}", pathCompleto, string.IsNullOrEmpty(pathCompleto) ? "" : "/", folder);
        }

在主程序中,我将有两个这样的调用:

CreateRootFolder(_graphClient, "Folder00");
CreateSubFolders(_graphClient, "Folder00", "FolderAA/FolderBB/FolderCC/FolderDD/FolderEE");

这可以改进,但就我而言,它很好地解决了问题。