【问题标题】:Using C# to access OneDrive For Business (Office365) - Can't list subfolders使用 C# 访问 OneDrive For Business (Office365) - 无法列出子文件夹
【发布时间】:2014-06-14 03:07:48
【问题描述】:

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

我目前正在使用 Microsoft.SharePoint.Client 来执行此操作。 我也觉得 OneDrive For Business 与 OneDrive 有很大的不同(它与 Sharepoint 的纠缠)。

例如...如果我的 OneDrive 网址是 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() 语句中,我不明白为什么它没有返回任何结果,因为我已更改 clientcontext 和 web 以指向要查询的新 URL 而不是指着文件的那个。

有谁知道它为什么要查找 /_vti_bin/sites.asmx,如果有的话,有人对我哪里出错有任何建议吗?

我是否以正确的方式解决这个问题?当涉及到 Sharepoint/OneDrive For Business 中的子文件夹时,我有什么遗漏吗?这是微软的一些怪事吗?

非常感谢

道吉

【问题讨论】:

    标签: c# synchronization sharepoint-2013 office365 onedrive


    【解决方案1】:

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

    例如你可能正在这样做:

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

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

    【讨论】:

    • 非常感谢,感谢您的帮助,我已经搞定了。这让我发疯了几天!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多