2014-04-28 25 views
2

为了备份目的(因为用户在意外删除他们不应该删除的内容时很棒)我正在尝试编写一些软件来下载我的内容公司用户“One Drives”到公司网络,以便我们可以备份它们,以防删除任何东西。使用C#访问OneDrive for Business(Office365) - 无法列出子文件夹

我目前正在使用Microsoft.SharePoint.Client来这样做。 我也觉得OneDrive For Business与OneDrive有很大不同(与Sharepoint存在纠缠)。

例如...如果我的OneDrive网址是 https://accountname-my.sharepoint.com/personal/firstname_lastname_mycompany_com/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(); 
} 

此代码工作正常的文档文件夹中恢复的文件夹列表,不过,我的问题是试图列出这些文件夹中的内容之一。

例如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()语句,我不明白为什么它不返回任何结果,因为我已经改变了clientcontext和网页指向新网址来查询而不是指向文件的那个。

有没有人有任何想法为什么它正在寻找/_vti_bin/sites.asmx,如果有的话,有没有人有任何建议,我要去哪里错了?

我正在以正确的方式去解决这个问题吗?在Sharepoint/OneDrive For Business中的子文件夹中是否存在缺少的内容?这是一些微软的怪胎吗?

非常感谢

Dougie

回答

7

你收到这个错误,因为你必须将网址传递到您的OneDrive商务文档库中的客户端上下文,而不是URL到您的OneDrive for Business网站。

E.g.你可能这样做:

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(); 

然后为每个文件夹回做同样的等等,直到你有文件夹的完整列表。

+0

非常感谢您,感谢您的帮助,我已经掌握了自己的想法。这让我呆了几天! – FridgeMagnet

相关问题