2011-10-06 88 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

祝賀解決方案。如果可以,請將您的答案標記爲「已接受」,以便其他人可以從您的成功中學習。乾杯〜 –

相關問題