【发布时间】:2016-03-29 17:22:23
【问题描述】:
我不喜欢从 OneDrive 获取特定文件夹对象。我希望根据用户正在查看的文件夹生成面包屑路径。
为了开始,我正在实例化SharePointClient,它以用户根文件夹为目标,如下所示:
var spClient = await AuthenticationHelper.EnsureSharePointClientCreatedAsync("MyFiles");
然后我像这样获取根文件和文件夹:
var rootFiles = await spClient.Files.ExecuteAsync();
var files = rootFiles.CurrentPage;
如果用户点击一个文件夹,我会像这样获取该文件夹的文件和文件夹:
var folderFiles = await spClient.Files[selectedItemID].ToFolder().Children.ExecuteAsync();
var files = folderFiles.CurrentPage;
在这种情况下,selectedItemID 只是用户选择的文件夹的Id 属性。
至于我遇到的问题是获取文件夹对象本身。我不断收到此错误:
Expected a relative URL path without query or fragment.
Parameter name: entitySetName
当我尝试执行以下操作之一时:
// first attempt
var folder = await spClient.Files[selectedItemID].ToFolder().ExecuteAsync();
// second attempt - which is the same as first attempt with use of GetById()
var folder = await spClient.Files.GetById(selectedItemID).ToFolder().ExecuteAsync();
// third attempt - which is the same as second attempt without chaining
var thisItemFetcher = spClient.Files.GetById(selectedItemID);
var thisFolderFetcher = thisItemFetcher.ToFolder();
var myFolder = await thisFolderFetcher.ExecuteAsync();
var folder = myFolder as Microsoft.Office365.SharePoint.FileServices.Folder;
如果我在查找文件时执行任何这些尝试,我会得到文件对象没有问题。
当然,我尝试查找此错误,但我没有找到任何地方。
我想做的很简单。我只需要返回一个简单对象列表
{
FolderID = folder.Id,
FolderName = folder.Name,
}
对于用户当前正在查看的文件夹以及每个父文件夹直到根文件夹。
我知道我可以根据folder.ParentReference.Id 属性递归地执行此操作。
现在您可能会想,为什么不能从用户正在查看的文件夹中请求文件和文件夹的列表?当然,基于任何返回的文件或文件夹.ParentReference.Id,您可以进行递归。那么这个问题的答案就是:如果文件夹是空的会发生什么?
有人能解释一下我在这里遇到的这个简单但不那么简单的问题吗?
根据SkyDrive Folder object docs:
A Folder object can be returned as part of:
/FOLDER_ID/files
/me/skydrive/files
/me/skydrive/shared/files
/USER_ID/skydrive/files
/ALBUM_ID/files
但我不确定这是否也适用于 Office 365 OneDrive。
查看最新的OneDrive API,他们似乎使用了完全不同的请求结构:
GET /drive/items/{item-id}
我的SarePointClient.Drive 没有公开Items 收藏。
对于那些好奇的人,我正在使用 Microsoft Office 365 My Files Library v1.0.22 访问 OneDrive。
【问题讨论】: