0

我已经组合了一个函数,该函数根据作为参数过去的 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();
    }
}
4

1 回答 1

0

我自己找到了这个答案。问题出在用于创建文件夹的代码中。

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

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

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

于 2011-10-26T03:57:30.847 回答