我一直在尝试利用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;
即使可以使用某些修复程序,也不确定它是否是最理想的解决方法,建议还是值得赞赏的。
答案 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");
这可以改进,但就我而言,它很好地解决了问题。