Проблемы с папкой SharePoint 2010

Я собрал функцию, которая создает папку sharepoint в библиотеке документов на основе URL-адреса, переданного в качестве аргумента. Код работает, и папка появляется в sharepoint из веб-приложения.

Однако, когда я впоследствии запрашиваю объект SPWeb для папки, он говорит, что папка не существует. Что не имеет смысла для меня. Еще более странно то, что этот самый код работал не так давно. Я использовал его для создания древовидных структур в sharepoint.

Даже если папка запроса не работает, GetFolder по-прежнему возвращает папку, но когда я добавляю файлы в возвращенную папку, я получаю исключение времени выполнения, указывающее, что файл не существует... что, как я предполагаю, означает папку, которую я пытаюсь чтобы добавить его, не существует, поскольку файл, который я добавляю, еще не существует. Именно поэтому я добавляю его.

Итак, мой вопрос: почему я получаю эту ошибку и почему FolderExists возвращает false, когда папка действительно существует? Мы знаем, что он существует, потому что GetFolder на самом деле возвращает его...

Я включил некоторый фактический код из приложения, чтобы прояснить ситуацию.

Если бы кто-то мог взглянуть на код и увидеть, что у него что-то выскакивает, это было бы фантастикой... Спасибо.

Код для создания папок:

    public void CreateFolder(SPUriBuilder url)
    {
        try
        {
            Log.Instance.WriteToLog("CreateFolder({0})", url);

            var library = GetLibrary(url.Library);
            if (library != null)
            {                    
                //  parse out string data
                //                    
                var parent = library.RootFolder.ServerRelativeUrl;
                var segments = url.Account.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
                var path = parent;

                //  get default folder collection
                //
                SPFolderCollection subFolders = _web.GetFolder(parent).SubFolders;

                //  check for sub-folders to create
                //
                if (segments.Length > 0)
                {
                    int i = 0;
                    do
                    {
                        //  check for folder and create if non-existant
                        //
                        var buildPath = String.Format("{0}/{1}", path, segments[i]);

                        if (_web.GetFolder(buildPath).Exists == false)
                            _web.GetFolder(path).SubFolders.Add(segments[i]);                            

                        //  retrieve new sub-folder collection
                        //
                        subFolders = _web.GetFolder(buildPath).SubFolders;                            
                        path = buildPath;

                        //  next folder in path
                        //
                        i++;
                    }
                    while (i < segments.Length);

                }

                //  finally, add folder of interest
                //
                subFolders.Add(url.Folder);                    

            }
        }
        catch (Exception e)
        {
            throw new SPImportException("Exception: {0}, creating folder: {1} in Library: {2}", e.Message, url.Folder, url.Library);
        }
    }

Код для папки запроса:

    public bool FolderExists(SPUriBuilder url)
    {
        return _web.GetFolder(url.Uri.LocalPath).Exists;
    }

Код для получения папки:

    private SPFolder GetFolder(SPUriBuilder url)
    {
        return _web.GetFolder(url.Uri.LocalPath);
    }

SPUriBuilder — это пользовательский класс, который я создал для сборки Uri:

public class SPUriBuilder
{
    public string SiteUrl { get; private set; }        
    public string Library { get; private set; }
    public string Parent { get; private set; }
    public string Folder { get; private set; }
    public string File { get; private set; }
    public string Account { get; private set; }

    public Uri Uri { get; private set; }

    public SPUriBuilder(string siteUrl, string library, string account, string parent, string folder)
    {
        this.SiteUrl = siteUrl;
        this.Library = library;
        this.Account = account;
        this.Parent = parent.Replace("\\", "/");
        this.Parent = this.Parent.StartsWith("/") ? this.Parent.Substring(1) : this.Parent;
        this.Folder = folder;

        StringBuilder url = new StringBuilder();

        url.AppendFormat("{0}/{1}/{2}", SiteUrl, Library, Account);
        if (String.IsNullOrEmpty(Parent) == false)
            url.AppendFormat("/{0}", Parent);
        url.AppendFormat("/{0}", Folder);

        this.Uri = new Uri(url.ToString());

    }

    public SPUriBuilder(SPUriBuilder uri, string file)
        : this(uri.SiteUrl, uri.Library, uri.Account, uri.Parent, uri.Folder)
    {
        this.File = file;

        StringBuilder url = new StringBuilder();

        url.AppendFormat("{0}/{1}", this.Uri.ToString(), this.File);

        this.Uri = new Uri(url.ToString());

    }

    public override string ToString()
    {
        return Uri.ToString();
    }
}

person user953710    schedule 06.10.2011    source источник


Ответы (1)


Я нашел ответ на это сам. Проблема была в коде, используемом для создания папки.

      var parent = library.RootFolder.ServerRelativeUrl;

      //  This line of code is incorrect, so it returned the wrong data, thus building the folder path incorrectly.
      //
      var segments = url.Account.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
      var path = parent;


      //   This is the replacement line of code that fixed the issue.
      //
      var segments = url.Uri.LocalPath.Substring(parent.Length+1).Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

    //   as well, this line had to be removed since it was no longer needed
    //
    //  finally, add folder of interest
            //
            subFolders.Add(url.Folder);  

В конечном итоге проблема заключалась в том, что не существовало структуры папок, в которой я пытался создать файл. Отсутствовал один или несколько сегментов пути.

Поэтому, если вы когда-нибудь увидите эту ошибку, убедитесь, что папка, в которую вы добавляете файл, существует. Если это не так, вы обязательно столкнетесь с этой ошибкой.

person user953710    schedule 26.10.2011
comment
Поздравляю с решением. Когда сможете, отметьте свой ответ как «принятый», чтобы другие могли извлечь уроки из вашего успеха. Ура~ - person Andrew Kozak; 22.12.2011