【问题标题】:SharePoint 2010 folder woesSharePoint 2010 文件夹问题
【发布时间】:2011-10-06 02:52:40
【问题描述】:

我已经组合了一个函数,该函数根据作为参数过去的 url 在文档库中创建一个共享点文件夹。代码有效,文件夹显示在 web 应用程序的 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();
    }
}

【问题讨论】:

    标签: sharepoint directory add not-exists


    【解决方案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);  
    

    最终问题是我试图在其中创建文件的文件夹结构不存在。路径中的一个或多个段丢失。

    因此,如果您看到此错误,请确保您正在向其中添加文件的文件夹存在。如果不是,您肯定会遇到此错误。

    【讨论】:

    • 祝贺解决方案。如果有能力,请将您的答案标记为“已接受”,以便其他人可以从您的成功中学习。干杯~
    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2015-12-06
    • 2012-05-30
    • 1970-01-01
    相关资源
    最近更新 更多