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

How do I loop through Files in a Folder and get the data from associated List columns?

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

过滤

设置是这样的:

列表:托管抵押品
查看:提案抵押品
文件夹:提案抵押品
相对文件夹 URL: /sites/collateral/Managed Collateral/Proposal 附属物

看起来像这样:

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

我试过遍历这些,但我似乎只能访问像 file.Namefile.TimeLastModified 这样的静态属性,但我的列表显示像 Content_x0020_Type 和 [=22 这样的列=].
我已经尝试过 file["Content_x0020_Type"] 之类的方法,但这对我也不起作用。

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

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

谢谢!

你知道当你遇到一个问题已经两天了,你已经阅读了无数的文档和论坛 posts 才最终 post 在某个地方提出问题只是为了解决问题不久之后?是的,那个。

无论如何,我认为我有一些东西可以以最有效的方式获取我想要的数据。我会 post 在这里而不是删除我的问题,以防它对其他人有帮助。

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

// 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;

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

既然您已经设法获得了对 SPFolder 对象的引用,那么让我们从那里开始吧。

您已使用 SPFolder 对象的 Files 属性 获取对 SPFileCollection 的引用。当您迭代此集合时,您正在处理 SPFile 个对象,一次一个。正如您已经发现的那样,SPFile 对象包含几个与文件本身有关的有趣属性。但是,为了访问您要查找的其他元数据,您需要使用 SPFile 对象的 Item 属性。通过引用文件的基础 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#)中使用的函数名称相同。