С# CSOM — проверьте, существует ли файл в библиотеке документов

Я кодирую на С# с помощью CSOM, мое приложение загружает страницу шаблона asp.net в библиотеку «/Pages/», мне нужно проверить, существует ли в этом месте файл с тем же именем до загрузки файла (тогда, возможно, он может возвращать логическое значение).

Я бегло просмотрел, но большинство решений, которые я нашел, относились к использованию Javascript или применялись к локальным развертываниям.

Если кто-то может указать мне в правильном направлении, я был бы признателен.


person Junior    schedule 11.03.2015    source источник


Ответы (4)


Вы можете рассмотреть следующие подходы, чтобы определить, существует ли файл или нет.

Основанный на запросе

Вы можете создать запрос 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 для возврата файлового объекта, расположенного по указанному относительному серверу 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))
      {
          //...
      }
 }    
person Vadim Gremyachev    schedule 11.03.2015
comment
Решение на основе запросов работает отлично. Между ними - какая разница? Почему вы используете один вместо другого? Спасибо еще раз! - person Junior; 12.03.2015
comment
Я бы также предпочел подход на основе запросов второму. Но в некоторых случаях вы можете получить преимущества, используя второй подход с точки зрения производительности. - person Vadim Gremyachev; 12.03.2015
comment
Для метода Web.GetFileByServerRelativeUrl обратите внимание, что вам, вероятно, потребуется указать больше, чем просто /documents/doc.docx, если ваш сайт находится на уровне папки ниже верхней части URL-адреса. Мне пришлось указать все после имени хоста... например, /sites/dept/hr/subsitename/documents/doc.docx - person vwfreak; 01.09.2016

Альтернативой 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
    }
}
person stinkyfriend    schedule 27.05.2016
comment
Согласовано. Что обычно нарушает проверку, так это ctx.Load(file), потому что файловый объект не может быть загружен, если он не существует. Вы правы, загружая только свойство Exists. - person Martin D; 24.01.2017
comment
попробовал этот подход, и я получил свойство Exists без каких-либо исключений для допустимых и недопустимых имен файлов. - person Abdul Hameed; 11.03.2020
comment
Работает отлично. Я думаю, что это лучший ответ, потому что он не использует ловушки слепых исключений, как предлагают здесь другие. - person Boris Zinchenko; 11.11.2020

если вы используете Client 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 )
     {
           .
           .
     }
}

Ресурс

person Jinxed    schedule 11.03.2015

Использование Linq для 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;

        }

    }
person EthR    schedule 02.10.2015