Проблемы с папками SharePoint 2010 - PullRequest
0 голосов
/ 06 октября 2011

Я собрал функцию, которая создает папку 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();
    }
}

1 Ответ

0 голосов
/ 26 октября 2011

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

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

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

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

...