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文件夹中的文件夹列表,但是,我的问题是尝试列出其中一个文件夹的内容.
如果我尝试运行上面相同的代码,这次我会抛出以下异常.
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)
然后为每个返回的文件夹执行相同的操作,直到您拥有完整的文件夹列表.