SharePoint 2016 FileNotFound异常

时间:2019-04-04 07:29:15

标签: c# sharepoint automation

通过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 Framework 4.5和x64

在其他帖子中,人们建议将其更改为.NET 3.5,但这是针对SharePoint 2010的。此外,将其更改为3.5最终会给我带来很多构建错误。

请帮助解决此问题。

2 个答案:

答案 0 :(得分:0)

以下是从SharePoint默认文档库下载文件并保存到本地文件夹中的代码段:

 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);
            }
        }

enter image description here

enter image description here

enter image description here

enter image description here

答案 1 :(得分:0)

我当时使用的是收款机,而上述解决方案对我而言并不起作用,这是我的工作方式,以便它可以帮助某人。

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);                               
            }

        }

    }
}