C# CSOM - 检查文档库中是否存在文件
C# CSOM - Check if File Exists in Document Library
我正在使用 CSOM 在 C# 中编码,我的应用将模板 asp.net 页面上传到“/Pages/”库,我需要它来检查该位置是否存在同名文件在文件上传之前(那么也许它可以 return 一个 bool 值)。
我确实快速浏览了一下,但我发现的大多数解决方案都涉及 Javascript 的使用或应用于本地部署。
如果有人能指出正确的方向,我将不胜感激。
如果您正在使用客户端 OM,如果文件不存在,它实际上会抛出异常:
using(var clientContext = new ClientContext(site))
{
Web web = clientContext.Web;
Microsoft.SharePoint.Client.File file = web.GetFileByServerRelativeUrl("/site/doclib/folder/filename.ext");
bool bExists = false;
try
{
clientContext.Load(file);
clientContext.ExecuteQuery(); //Raises exception if the file doesn't exist
bExists = file.Exists; //may not be needed - here for good measure
}
catch{ }
if (bExists )
{
.
.
}
}
Resource
判断文件是否存在可以考虑以下方法
基于查询
您可以构建 CAML 查询以通过其 Url 查找列表项,如下所示:
public static bool FileExists(List list, string fileUrl)
{
var ctx = list.Context;
var qry = new CamlQuery();
qry.ViewXml = string.Format("<View Scope=\"RecursiveAll\"><Query><Where><Eq><FieldRef Name=\"FileRef\"/><Value Type=\"Url\">{0}</Value></Eq></Where></Query></View>",fileUrl);
var items = list.GetItems(qry);
ctx.Load(items);
ctx.ExecuteQuery();
return items.Count > 0;
}
用法
using (var ctx = GetSPOContext(webUri,userName,password))
{
var list = ctx.Web.Lists.GetByTitle(listTitle);
if(FileExists(list,"/documents/SharePoint User Guide.docx"))
{
//...
}
}
Web.GetFileByServerRelativeUrl
方法
使用Web.GetFileByServerRelativeUrl Method 来return 位于指定相对服务器的文件对象URL。
如果文件不存在,将遇到异常Microsoft.SharePoint.Client.ServerException:
public static bool TryGetFileByServerRelativeUrl(Web web, string serverRelativeUrl,out Microsoft.SharePoint.Client.File file)
{
var ctx = web.Context;
try{
file = web.GetFileByServerRelativeUrl(serverRelativeUrl);
ctx.Load(file);
ctx.ExecuteQuery();
return true;
}
catch(Microsoft.SharePoint.Client.ServerException ex){
if (ex.ServerErrorTypeName == "System.IO.FileNotFoundException")
{
file = null;
return false;
}
else
throw;
}
}
用法:
using (var ctx = GetSPOContext(webUri,userName,password))
{
Microsoft.SharePoint.Client.File file;
if(TryGetFileByServerRelativeUrl(ctx.Web,"/documents/SharePoint User Guide.docx",out file))
{
//...
}
}
使用 Linq To SharePoint
public bool FolderExists(string library, string name) {
using (var ctx = SPStatic.Context(_sharePointSiteUrl)) {
List sharedDocs = ctx.Web.Lists.GetByTitle(library);
var query = ctx.LoadQuery(sharedDocs.RootFolder.Folders.Where(fd => fd.Name == name));
ctx.ExecuteQuery();
Folder f = query.SingleOrDefault();
return f != null;
}
}
Web.GetFileByServerRelativeUrl(上面发布的@vadim)的替代方法是 Load(checkFile, p => p.Exists);
并且在上下文中...
using (ClientContext ctx = new ClientContext("https://yoursubdomainhere.sharepoint.com/"))
{
Web web = ctx.Web;
Microsoft.SharePoint.Client.File checkFile = web.GetFileByServerRelativeUrl("/sites/Documents/MyFile.docx");
ctx.Load(checkFile, fe => fe.Exists);
ctx.ExecuteQuery();
if (!checkFile.Exists)
{
//Do something here
}
}
我正在使用 CSOM 在 C# 中编码,我的应用将模板 asp.net 页面上传到“/Pages/”库,我需要它来检查该位置是否存在同名文件在文件上传之前(那么也许它可以 return 一个 bool 值)。
我确实快速浏览了一下,但我发现的大多数解决方案都涉及 Javascript 的使用或应用于本地部署。
如果有人能指出正确的方向,我将不胜感激。
如果您正在使用客户端 OM,如果文件不存在,它实际上会抛出异常:
using(var clientContext = new ClientContext(site))
{
Web web = clientContext.Web;
Microsoft.SharePoint.Client.File file = web.GetFileByServerRelativeUrl("/site/doclib/folder/filename.ext");
bool bExists = false;
try
{
clientContext.Load(file);
clientContext.ExecuteQuery(); //Raises exception if the file doesn't exist
bExists = file.Exists; //may not be needed - here for good measure
}
catch{ }
if (bExists )
{
.
.
}
}
Resource
判断文件是否存在可以考虑以下方法
基于查询
您可以构建 CAML 查询以通过其 Url 查找列表项,如下所示:
public static bool FileExists(List list, string fileUrl)
{
var ctx = list.Context;
var qry = new CamlQuery();
qry.ViewXml = string.Format("<View Scope=\"RecursiveAll\"><Query><Where><Eq><FieldRef Name=\"FileRef\"/><Value Type=\"Url\">{0}</Value></Eq></Where></Query></View>",fileUrl);
var items = list.GetItems(qry);
ctx.Load(items);
ctx.ExecuteQuery();
return items.Count > 0;
}
用法
using (var ctx = GetSPOContext(webUri,userName,password))
{
var list = ctx.Web.Lists.GetByTitle(listTitle);
if(FileExists(list,"/documents/SharePoint User Guide.docx"))
{
//...
}
}
Web.GetFileByServerRelativeUrl
方法
使用Web.GetFileByServerRelativeUrl Method 来return 位于指定相对服务器的文件对象URL。
如果文件不存在,将遇到异常Microsoft.SharePoint.Client.ServerException:
public static bool TryGetFileByServerRelativeUrl(Web web, string serverRelativeUrl,out Microsoft.SharePoint.Client.File file)
{
var ctx = web.Context;
try{
file = web.GetFileByServerRelativeUrl(serverRelativeUrl);
ctx.Load(file);
ctx.ExecuteQuery();
return true;
}
catch(Microsoft.SharePoint.Client.ServerException ex){
if (ex.ServerErrorTypeName == "System.IO.FileNotFoundException")
{
file = null;
return false;
}
else
throw;
}
}
用法:
using (var ctx = GetSPOContext(webUri,userName,password))
{
Microsoft.SharePoint.Client.File file;
if(TryGetFileByServerRelativeUrl(ctx.Web,"/documents/SharePoint User Guide.docx",out file))
{
//...
}
}
使用 Linq To SharePoint
public bool FolderExists(string library, string name) {
using (var ctx = SPStatic.Context(_sharePointSiteUrl)) {
List sharedDocs = ctx.Web.Lists.GetByTitle(library);
var query = ctx.LoadQuery(sharedDocs.RootFolder.Folders.Where(fd => fd.Name == name));
ctx.ExecuteQuery();
Folder f = query.SingleOrDefault();
return f != null;
}
}
Web.GetFileByServerRelativeUrl(上面发布的@vadim)的替代方法是 Load(checkFile, p => p.Exists);
并且在上下文中...
using (ClientContext ctx = new ClientContext("https://yoursubdomainhere.sharepoint.com/"))
{
Web web = ctx.Web;
Microsoft.SharePoint.Client.File checkFile = web.GetFileByServerRelativeUrl("/sites/Documents/MyFile.docx");
ctx.Load(checkFile, fe => fe.Exists);
ctx.ExecuteQuery();
if (!checkFile.Exists)
{
//Do something here
}
}