获取sharepoint列表的所有项目

时间:2015-06-12 07:00:17

标签: c# sharepoint directory subdirectory client-object-model

我想下载我的sharepoint列表的所有文件。 我用这种方法下载文件:

  public void DownloadFilesOfSpecialtys( )
       {


           using (var clientContext = new ClientContext(url))
           {

               foreach (var item in ids)
               {

                   int listItemId = int.Parse(item.ToString());
                   statics.files = int.Parse(ids.Count.ToString());

                   var list = clientContext.Web.Lists.GetByTitle(listtitle);
                   var listItem = list.GetItemById(listItemId);
                   clientContext.Load(list);
                   clientContext.Load(listItem, i => i.File);
                   clientContext.ExecuteQuery();

                   var fileRef = listItem.File.ServerRelativeUrl;
                   var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(clientContext, fileRef);
                   var fileName = Path.Combine(@path , (string)listItem.File.Name);



                   using (var fileStream = System.IO.File.Create(fileName))
                   {
                       fileInfo.Stream.CopyTo(fileStream);
                   }


               }


           }

       }

现在我的问题是,子文件夹中的文件没有使用此方法下载。 是否有机会浏览列表中的所有子文件夹并下载所有文件?

2 个答案:

答案 0 :(得分:5)

因为你的目标是:

  

下载我的SharePoint列表的所有文件

以下示例演示了如何完成它:

using (var ctx = new ClientContext(webUri))
{
     var qry = new CamlQuery();
     qry.ViewXml = "<View Scope='RecursiveAll'>" +
                              "<Query>" + 
                                  "<Where>" + 
                                        "<Eq>" + 
                                             "<FieldRef Name='FSObjType' />" + 
                                             "<Value Type='Integer'>0</Value>" + 
                                        "</Eq>" + 
                                 "</Where>" + 
                               "</Query>" + 
                            "</View>"; 

    var sourceList = ctx.Web.Lists.GetByTitle(sourceListTitle);
    var items = sourceList.GetItems(qry);
    ctx.Load(items);
    ctx.ExecuteQuery();
    foreach (var item in items)
    {
        //1. ensure target directory exists
        var curPath = targetPath + System.IO.Path.GetDirectoryName((string)item["FileRef"]);
        Directory.CreateDirectory(curPath);
        //2. download a file
        DownloadAFile(item, curPath);   
     }
 }

,其中

    private static void DownloadAFile(Microsoft.SharePoint.Client.ListItem item,string targetPath)
    {
        var ctx = (ClientContext)item.Context;
        var fileRef = (string)item["FileRef"];
        var fileName = System.IO.Path.GetFileName(fileRef);
        var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(ctx, fileRef);
        var filePath = Path.Combine(targetPath, fileName);
        using (var fileStream = System.IO.File.Create(filePath))
        {
            fileInfo.Stream.CopyTo(fileStream);
        }
    }
  

注意:与SharePoint 2010/2013 CSOM API兼容

     

作为奖励,一旦文件存在,文件夹结构将被保留   下载

答案 1 :(得分:0)

当你有listItem对象时,它可能已经是一个文件夹了,所以你可以使用.Folder属性将它当作一个文件夹:

var listItemAsFolder = listItem.Folder;
if (listItemAsFolder != null) {
  // here you can access listItemAsFolder.Files to get all files in the folder
  // also, you can access listItemAsFolder.SubFolders to get all subfolders.
}

顺便说一下,还有一个回路:如果你有一个SPFolder对象,请使用.Item将其视为ListItem。