使用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
您收到该错误,因为您必须将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();
然后对返回的每个文件夹执行相同的操作等,直到您拥有完整的文件夹列表。