如何遍历文件夹中的文件并从关联的列列中获取数据?

时间:2015-10-29 12:51:33

标签: c# sharepoint sharepoint-clientobject

我是Sharepoint客户端对象模型的新手,我很难从特定List获取所有项目及其列数据。我认为这让我感到困惑,因为它实际上是Folder设置为List,然后由View过滤!

设置如下:

列表:托管抵押品
查看:提案抵押品
文件夹:提案抵押品
文件夹相对网址:/ sites / collat​​eral / maaged Collat​​eral / Proposal Collat​​eral

看起来像这样:

enter image description here

我可以使用Lists.GetByTitle("title");GetFolderByServerRelativeUrl("path");等方法分别获取ListFolder个对象。我从这些中得到了正确的Count,所以我认为它们是正确的。

我已尝试迭代这些但我似乎只能访问file.Namefile.TimeLastModified之类的静态属性,但我的列表显示了Content_x0020_TypeProposal_x0020_Type等列。
我尝试了file["Content_x0020_Type"]之类的东西,但这对我来说也不起作用。

如何获取文件夹,然后遍历每个项目并从关联的列表/视图中的列中获取数据?

如果需要,我可以发布我的代码,但我觉得这只会让事情变得混乱。

谢谢!

2 个答案:

答案 0 :(得分:1)

你知道,当你有两天的问题时,你已经阅读了无数的文档和论坛帖子,最后在某个地方发布了一个问题,只是为了在不久之后解决问题吗?是的,那个。

无论如何,我认为我有能力以最有效的方式获取我想要的数据。我会在这里发布,而不是删除我的问题以防其他人帮助。

如果有人有任何改进或建议,我可能会更改已接受的答案。

// Fields
private static string _siteUrl;
private static string _userName;
private static string _passWord;
private static string _domain;

private static DataTable dataTable;

private ClientContext _clientContext;
private Web _spWebsite;

// We'll store the data in a table for ease
dataTable = new DataTable();
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("Path", typeof(string));
dataTable.Columns.Add("Proposal Grouping", typeof(string));
dataTable.Columns.Add("Modified", typeof(DateTime));

_clientContext = new ClientContext(_siteUrl);
_clientContext.Credentials = new NetworkCredential(_userName, _passWord, _domain);
_spWebsite = _clientContext.Web;

List list = _spWebsite.Lists.GetByTitle(@"Managed Collateral");
CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml = @"<View><Query></Query></View>";
camlQuery.FolderServerRelativeUrl = @"/sites/collateral/Managed Collateral/Proposal Collateral";

ListItemCollection listItems = list.GetItems(camlQuery);

_clientContext.Load(listItems, items => items.Include(
    item => item.File.Name,
    item => item.File.ServerRelativeUrl,
    item => item["Proposal_x0020_Navigation_x0020_Grouping"],
    item => item["Modified"]));

_clientContext.ExecuteQuery();

if (listItems != null)
{
    foreach (ListItem item in listItems)
    {
        DataRow dr = dataTable.NewRow();
        dr["Name"] = item.File.Name;
        dr["Path"] = item.File.ServerRelativeUrl;
        dr["Proposal Grouping"] = item["Proposal_x0020_Navigation_x0020_Grouping"];
        dr["Modified"] = item["Modified"];
        dataTable.Rows.Add(dr);
    }
}

dataGridView.DataSource = dataTable;

答案 1 :(得分:1)

有几种方法可以完成您在问题中描述的内容。

由于您已设法获得对SPFolder对象的引用,因此请继续并从那里开始。

您已使用Files对象的SPFolder属性来获取对SPFileCollection的引用。在迭代此集合时,您正在使用SPFile个对象,一次一个。正如您已经发现的那样,SPFile对象包含有关文件本身的几个有趣属性。但是,为了访问您要查找的其他元数据,您需要使用Item对象的SPFile属性。通过引用文件的基础SPListItem对象,您可以引用要尝试枚举的列表字段。

可以使用您之前尝试过的索引器来访问列表字段(列)。要构建您提供的代码段:

SPFolder folder = web.GetFolderByServerRelativeUrl("path")
foreach (SPFile file in folder.Files)
{
    SPListItem item = file.Item
    String contentType = item["Content_x0020_Type"]
}

与往常一样,考虑包括适当的异常处理并选择适合您特定需求的变量类型。

当您开始使用不同的字段类型时,我保留以下参考资料,以指导我使用SharePoint提供的所有不同类型的字段: http://social.technet.microsoft.com/wiki/contents/articles/20831.sharepoint-a-complete-guide-to-getting-and-setting-fields-using-powershell.aspx

此处的示例适用于PowerShell,但函数名称与您在其他语言(例如C#)中使用的函数名称相同。