我想知道如何使用SharePoint客户端对象模型(CSOM)(Microsoft.SharePoint.Client)和列表的完整URL从SharePoint列表中下载所有文档。
例如,如果URL为http://teamhub.myorg.local/sites/teams/it/ISLibrary/Guides/
是否可以直接连接到该URL并检索在那里存储的所有文档?
我已经尝试了以下代码,但出现错误,似乎还需要将URL分为两部分。
string baseURL = "http://teamhub.myorg.local/sites/";
string listURL = "teams/it/ISLibrary/Guides/";
var ctx = new ClientContext(baseURL);
ctx.Credentials = new SharePointOnlineCredentials(userName, SecuredpassWord);
var list = ctx.Web.GetList(listURL);
ctx.Load(list);
ctx.ExecuteQuery();
Console.WriteLine(list.Title);
运行此代码时,我只会收到“找不到文件”错误。
可以通过在某个地方简单地输入完整的url来做到吗?
我将需要进行此连接,并获得许多不同列表的所有文档的100倍,因此,最好是有一种使用完整URL的方法。
任何建议都值得赞赏。谢谢
答案 0 :(得分:1)
Microsoft.SharePoint.Client.Web.GetListByUrl使用webRelativeUrl,例如:
我的网站:https://tenant.sharepoint.com/sites/TST
,图书馆:https://tenant.sharepoint.com/sites/TST/MyDoc4
因此代码将是:
Web web = clientContext.Web;
var lib=web.GetListByUrl("/MyDoc4");
您共享的listURL似乎是一个文件夹,因此我们可以按以下方式获取该文件夹和文件夹中的文件:
Web web = clientContext.Web;
Folder folder = web.GetFolderByServerRelativeUrl("/sites/TST/MyDoc4/Folder");
var files = folder.Files;
clientContext.Load(files);
clientContext.ExecuteQuery();
下载文件:
foreach (var file in files)
{
clientContext.Load(file);
Console.WriteLine(file.Name);
ClientResult<Stream> stream = file.OpenBinaryStream();
clientContext.ExecuteQuery();
var fileOut = Path.Combine(localPath, file.Name);
if (!System.IO.File.Exists(fileOut))
{
using (Stream fileStream = new FileStream(fileOut, FileMode.Create))
{
CopyStream(stream.Value, fileStream);
}
}
}
private static void CopyStream(Stream src, Stream dest)
{
byte[] buf = new byte[8192];
for (; ; )
{
int numRead = src.Read(buf, 0, buf.Length);
if (numRead == 0)
break;
dest.Write(buf, 0, numRead);
}
}