【问题标题】:SharePoint 2016 FileNotFound ExceptionSharePoint 2016 FileNotFoundException
【发布时间】:2019-04-04 07:29:14
【问题描述】:

通过 C#,我正在尝试从 SharePoint (SharePoint 2016) 下载文件。以下是我正在使用的代码:

        site = new ClientContext(url);
        //credential setting has no issues. So I am skipping it. I am using NetworkCredentials
        site.Load(web);
        site.ExecuteQuery();
        List list = web.Lists.GetByTitle("Documents");
        site.Load(list);
        site.ExecuteQuery();
        site.Load(list.RootFolder);
        site.ExecuteQuery();
        site.Load(list.RootFolder.Folders);
        site.ExecuteQuery();
        Folder folder = web.GetFolderByServerRelativeUrl(sharePointPath);
        site.Load(folder);
        site.ExecuteQuery();
        site.Load(folder.Files);
        site.ExecuteQuery();

在执行最后一个“site.ExecuteQuery()”时,抛出异常:

ExceptionMessage: File not found
at Microsoft.SharePoint.Client.ClientRequest.ProcessResponseStream

但是,该路径中有文件,我们可以使用相同的凭据手动上传和下载。 URL、路径等已经过双重检查,没有问题。 当我打印“folder.ItemCount”时,它正在打印正确的编号。文件夹中的文件。只有在 ExecuteQuery 加载文件时,才会抛出异常。

构建设置:.NET 框架 4.5 和 x64

在其他帖子中,人们建议更改为 .NET 3.5,但它适用于 SharePoint 2010。此外,将其更改为 3.5 最终会导致很多构建错误。

请帮忙解决这个问题。

【问题讨论】:

    标签: c# sharepoint automation


    【解决方案1】:

    这里是从 SharePoint 默认文档库下载文件并保存到本地文件夹的代码 sn-p:

     static void Main(string[] args)
            {
                string siteUrl = "http://sp2016/sites/dev";
                ClientContext clientContext = new ClientContext(siteUrl);
                var list = clientContext.Web.Lists.GetByTitle("Documents");
                var listItem = list.GetItemById(5);
                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(@"C:\Test", (string)listItem.File.Name);
                using (var fileStream = System.IO.File.Create(fileName))
                {
                    fileInfo.Stream.CopyTo(fileStream);
                }
            }
    

    【讨论】:

      【解决方案2】:

      我正在使用收集和上述解决方案对我不起作用,这是我的做法,以便它可以帮助某人。

      List list = web.Lists.GetByTitle("Events");
      ListItemCollection listItems = list.GetItems(cmlqry);
      context.Load(listItems);               
      context.ExecuteQuery();
      
      if (listItems != null)
      {
          foreach (var listItem in listItems)
          {
              Console.WriteLine("Id: {0}, Title: {1}", listItem["ID"].ToString(), listItem["Title"].ToString());
      
              context.Load(listItem.AttachmentFiles);
              context.ExecuteQuery();
      
              foreach (var file in listItem.AttachmentFiles)
              {
                  Console.WriteLine("File: {0}", file.FileName);
                  var fileRef = file.ServerRelativeUrl;
                  var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(context, fileRef);
                  var fileName = Path.Combine(@"C:\temp\Events\", String.Format("{0}_{1}", listItem.Id, file.FileName));
                  using (var fileStream = System.IO.File.Create(fileName))
                  {
                      fileInfo.Stream.CopyTo(fileStream);                               
                  }
      
              }
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-10-02
        • 2016-11-28
        • 1970-01-01
        • 2019-08-11
        • 2016-10-15
        • 2017-07-19
        • 2017-12-04
        • 1970-01-01
        • 2017-10-22
        相关资源
        最近更新 更多