使用C#访问OneDrive For Business(Office365) - 无法列出子文件夹

Fri*_*net 2 c# synchronization office365 sharepoint-2013 onedrive

为了备份目的(因为用户很不小心删除了他们不应该做的事情)我正在尝试编写一些软件来将公司用户"One Drives"的内容下载到公司网络,以便我们可以备份它们,以防万一他们删除任何东西

我目前正在使用Microsoft.SharePoint.Client这样做.我也觉得OneDrive For Business与OneDrive的不同之处(它与Sharepoint的纠缠)相差甚远.

例如......如果我的OneDrive网址是 https://accountname-my.sharepoint.com/personal/firstname_lastname_mycompany_com/Documents/

我可以成功列出文档根目录中的所有文件夹,并下载Documents文件夹根目录中的所有文件.

这是列出文档中文件夹的示例.

public void Listfiles()
{
    var folders = ListFolders(dirPath, clientContext, web);
    // now do something with results contained in 'folders'
}

public List GetDocumentLibrary(string libraryName, ClientContext clientContext, Web web)
{
    var query = clientContext.LoadQuery(web.Lists.Where(p => p.Title == libraryName));
    clientContext.ExecuteQuery();
    return query.FirstOrDefault();
}

public List<Folder> ListFolders(string libraryName, ClientContext clientContext, Web web)
{
    var list = GetDocumentLibrary(libraryName, clientContext, web);
    var folders = list.RootFolder.Folders;
    clientContext.Load(folders);
    clientContext.ExecuteQuery();
    return folders.ToList();
}
Run Code Online (Sandbox Code Playgroud)

此代码适用于返回Documents文件夹中的文件夹列表,但是,我的问题是尝试列出其中一个文件夹的内容.

例如https://accountname-my.sharepoint.com/personal/firstname_lastname_mycompany_com/Documents/PurchaseRequests/

如果我尝试运行上面相同的代码,这次我会抛出以下异常.

An unhandled exception of type 'Microsoft.SharePoint.Client.ClientRequestException'      occurred in Microsoft.SharePoint.Client.dll

Additional information: Cannot contact site at the specified URL 
https://accountname-my.sharepoint.com/personal/firstname_lastname_mycompany_com/Documents. 
There is no Web named "/personal/firstname_lastname_mycompany_com/Documents/_vti_bin/sites.asmx"
Run Code Online (Sandbox Code Playgroud)

这是发生在GetDocumentLibrary()中的executeQuery()语句,我不明白为什么它不返回任何结果,因为我已经改变了clientcontext和网页指向新的URL,而不是查询一个指点在文件.

有没有人知道它为什么要寻找/_vti_bin/sites.asmx,如果有的话,是否有人对我出错的地方有任何建议?

我是以正确的方式来做这件事的吗?对于Sharepoint/OneDrive For Business中的子文件夹,我有什么遗漏吗?这是微软的一些奇怪吗?

非常感谢

Dougie

小智 8

您收到该错误是因为您必须将Url传递到OneDrive for Business文档库,而不是将Url传递到OneDrive for Business网站.

你可能正在这样做:

new ClientContext("https://accountname-my.sharepoint.com/personal/firstname_lastname_mycompany_com/Documents/")
Run Code Online (Sandbox Code Playgroud)

当你应该这样做:

new ClientContext("https://accountname-my.sharepoint.com/personal/firstname_lastname_mycompany_com/")
Run Code Online (Sandbox Code Playgroud)

请注意,Url的"文档"部分是文档库而不是站点.您必须将站点Url传递给新的ClientContext().这就是你得到错误的原因.

要列出所有文件夹,您需要进行一些递归或类似操作.获得根文件夹的初始列表后,对于该列表中的每个文件夹执行以下操作:

clientContext.Load(folder.Folders);
clientContext.ExecuteQuery();
Run Code Online (Sandbox Code Playgroud)

然后为每个返回的文件夹执行相同的操作,直到您拥有完整的文件夹列表.