Проблемы с папкой 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();
}
}
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);
В конечном итоге проблема заключалась в том, что не существовала структура папок, в которой я пытался создать файл. Отсутствовал один или несколько сегментов в пути.
Поэтому, если вы когда-нибудь увидите эту ошибку, убедитесь, что у вас есть папка, в которую вы добавляете файл. Если это не так, вы наверняка испытаете эту ошибку.