2011-10-06 86 views
0

我已经放在一起,根据过去作为参数的url创建文档库中的sharepoint文件夹。代码起作用,文件夹显示在web应用程序的共享点中。SharePoint 2010文件夹困境

但是,当我查询该文件夹的SPWeb对象后,它说该文件夹不存在。这对我来说毫无意义。更奇怪的是,这个相同的代码在不久之前就起作用了。我一直在使用它来创建共享点中的树结构。

即使查询文件夹失败,GetFolder仍然会返回一个文件夹,但是当我将文件添加到返回的文件夹时,我得到一个运行时异常,指出该文件不存在......我认为这意味着文件夹我试图将它添加到不存在,因为我添加的文件不存在。这就是我加入它的原因。

所以我的问题是,为什么我得到这个错误,为什么FolderExists返回false时,该文件夹实际存在?我们知道它是存在的,因为GetFolder实际上会返回它...

我已经包含了一些来自应用程序的实际代码,以使事情清楚。

如果有人可以看看代码,看看和任何他们跳了出来,这将是fantabulous ...谢谢

代码来构建文件夹:

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

回答

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

最终的问题竟然是文件夹结构并不存在,我试图创造,在路径的一个或多个片段失踪的文件。

所以,如果你看到这个错误,请确保你的文件夹存在,你正在添加文件。如果不是,你肯定会遇到这个错误。

+0

祝贺解决方案。如果可以,请将您的答案标记为“已接受”,以便其他人可以从您的成功中学习。干杯〜 –

相关问题