使用C#访问OneDrive For Business(Office365)-可以';t列出子文件夹

本文关键字:文件夹 可以 OneDrive 访问 For Business Office365 使用 | 更新日期: 2023-09-27 18:00:45

出于备份目的(因为用户非常擅长意外删除不该删除的内容),我正在尝试编写一些软件,将我公司用户"One Drives"的内容下载到公司网络,以便我们可以对其进行备份,以防他们删除任何内容。

我目前正在使用Microsoft.SharePoint.Client来完成此操作。我还认为OneDrive For Business与OneDrive有足够的不同(因为它与Sharepoint纠缠在一起)。

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

我可以成功地列出Documents根目录中的所有文件夹,并下载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();
}

这段代码可以很好地返回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"

这发生在GetDocumentLibrary()中的ExecuteQuery()语句中,我不明白为什么它没有返回任何结果,因为我已经将客户端上下文和web更改为指向要查询的新URL,而不是指向文档的URL。

有人知道它为什么在寻找/''vti_bin/sites.asmx吗?如果有,有人对我的错误有什么建议吗?

我这样做正确吗?当涉及到Sharepoint/NOneDrive For Business中的子文件夹时,我缺少什么吗?这是微软的怪癖吗?

非常感谢

Dougie

使用C#访问OneDrive For Business(Office365)-可以';t列出子文件夹

您收到该错误,因为您必须将OneDrive for Business文档库的Url传递到客户端上下文,而不是将Url传递到OneDrive for Business网站。

例如,您可能正在这样做:

new ClientContext("https://accountname-my.sharepoint.com/personal/firstname_lastname_mycompany_com/Documents/")

什么时候应该这样做:

new ClientContext("https://accountname-my.sharepoint.com/personal/firstname_lastname_mycompany_com/")

请注意,Url的"文档"部分是文档库,而不是网站。必须将网站Url传递给新的ClientContext()。这就是你出错的原因。

要列出所有文件夹,您需要进行一些递归或类似操作。一旦你得到了根文件夹的初始列表,对该列表中的每个文件夹执行:

clientContext.Load(folder.Folders);
clientContext.ExecuteQuery();

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