2015-10-13 139 views
1

我試圖在Sharepoint在線列表中創建一個文件夾結構。 我創建根據這篇文章名爲Shared1列表:在Sharepoint在線列表中創建文件夾結構

http://blogs.technet.com/b/catastrophic_failure_joannav/archive/2013/10/23/how-to-create-a-custom-list-in-sharepoint-online-quot-w15-quot.aspx

而且我使用此代碼試圖創建一個底層結構:

using (var clientContext = new ClientContext("https://myEnv.sharepoint.com")) 
{ 
    var passWord = new SecureString(); 
    foreach (char c in "myPSW".ToCharArray()) passWord.AppendChar(c); 

    clientContext.Credentials = new SharePointOnlineCredentials("[email protected]", passWord); 
    Web web = clientContext.Web; 
    clientContext.Load(web); 
    clientContext.ExecuteQuery(); 
    var folder = CreateFolder(clientContext.Web, "Shared1", "FolderA/SubFolderA/SubSubFolderA"); 
} 

/// <summary> 
/// Create Folder client object 
/// </summary> 
/// <param name="web"></param> 
/// <param name="listTitle"></param> 
/// <param name="fullFolderUrl"></param> 
/// <returns></returns> 
public static Folder CreateFolder(Web web, string listTitle, string fullFolderUrl) 
{ 
    if (string.IsNullOrEmpty(fullFolderUrl)) 
     throw new ArgumentNullException("fullFolderUrl"); 
    var list = web.Lists.GetByTitle(listTitle); 
    return CreateFolderInternal(web, list.RootFolder, fullFolderUrl); 
} 

private static Folder CreateFolderInternal(Web web, Folder parentFolder, string fullFolderUrl) 
{ 
    var folderUrls = fullFolderUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 
    string folderUrl = folderUrls[0]; 
    var curFolder = parentFolder.Folders.Add(folderUrl); 
    web.Context.Load(curFolder); 
    web.Context.ExecuteQuery(); 

    if (folderUrls.Length > 1) 
    { 
     var subFolderUrl = string.Join("/", folderUrls, 1, folderUrls.Length - 1); 
     return CreateFolderInternal(web, curFolder, subFolderUrl); 
    } 
    return curFolder; 
} 

public static Folder GetFolder(Web web, string fullFolderUrl) 
{ 
    if (string.IsNullOrEmpty(fullFolderUrl)) 
     throw new ArgumentNullException("fullFolderUrl"); 

    if (!web.IsPropertyAvailable("ServerRelativeUrl")) 
    { 
     web.Context.Load(web, w => w.ServerRelativeUrl); 
     web.Context.ExecuteQuery(); 
    } 
    var folder = web.GetFolderByServerRelativeUrl(web.ServerRelativeUrl + fullFolderUrl); 
    web.Context.Load(folder); 
    web.Context.ExecuteQuery(); 
    return folder; 
} 

並且在執行我得到這個錯誤:

Unhandled Exception: Microsoft.SharePoint.Client.ServerException: List 'Shared1' 
does not exist at site with URL 'https://myEnv.sharepoint.com'. 
    at Microsoft.SharePoint.Client.ClientRequest.ProcessResponseStream(Stream res 
ponseStream) 
    at Microsoft.SharePoint.Client.ClientRequest.ProcessResponse() 
    at SharepointFolderRename.Program.CreateFolderInternal(Web web, Folder parent 
Folder, String fullFolderUrl) in \\vmware-host\shared folders\Documents\Visual S 
tudio 2012\Projects\Trunk2015\SharepointFolderRename\Program.cs:line 84 
    at SharepointFolderRename.Program.Main(String[] args) in \\vmware-host\shared 
folders\Documents\Visual Studio 2012\Projects\Trunk2015\SharepointFolderRename\ 
Program.cs:line 49 

這是SP列表的打印。 Print of the list

我錯過了什麼?

+1

顯示您的列表創建代碼。 –

+0

SharePoint ** 2015 **?我猜這是一個錯字.. –

+1

是的。修改它 – MaPi

回答

1

你得到這些錯誤的原因與指定的不正確的網址有關。而在子網站Shared1存在於您的列表中,您要訪問它的根站點,下面的圖片說明了它

enter image description here

因此,解決辦法是初始化客戶端上下文正確的網站的話,更換:

using (var clientContext = new ClientContext("https://myEnv.sharepoint.com/")) 
{ 
    //... 
} 

using (var clientContext = new ClientContext("https://myEnv.sharepoint.com/Shared1")) 
{ 
    //... 
} 

It is assumed that you want to ctreate folders for list located on Shared1 sub site

實施例下面

的示例演示瞭如何在Documents庫創建下News子站點的文件夾層次結構:(https://contoso.sharepoint.com/news

Archive 
    | 
    2009 
     | 
     09 

用法

using (var ctx = GetContext("https://contoso.sharepoint.com/news", userName, password)) 
{ 
     var list = ctx.Web.Lists.GetByTitle("Documents"); 
     var folder = list.CreateFolder("Archive/2015/09"); 
     Console.WriteLine(folder.ServerRelativeUrl); 
} 

其中

public static ClientContext GetContext(Uri webUri, string userName, string password) 
{ 
    var securePassword = new SecureString(); 
    foreach (var ch in password) securePassword.AppendChar(ch); 
    return new ClientContext(webUri) { Credentials = new SharePointOnlineCredentials(userName, securePassword) }; 
} 

ListExtensions.cs文件:

using System; 
using Microsoft.SharePoint.Client; 

namespace SharePoint.ClientExtensions 
{ 
    public static class ListExtensions 
    { 


     /// <summary> 
     /// Create Folder in List 
     /// </summary> 
     /// <param name="list"></param> 
     /// <param name="folderUrl"></param> 
     /// <returns></returns> 
     public static Folder CreateFolder(this List list, string folderUrl) 
     { 
      if (string.IsNullOrEmpty(folderUrl)) 
       throw new ArgumentNullException("folderUrl"); 
      if (!list.IsPropertyAvailable("RootFolder")) 
      { 
       list.Context.Load(list.RootFolder); 
       list.Context.ExecuteQuery(); 
      } 
      return CreateFolderInternal(list.RootFolder,folderUrl); 
     } 

     private static Folder CreateFolderInternal(Folder parentFolder, string folderUrl) 
     { 
      var folderUrlParts = folderUrl.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 
      var curFolder = parentFolder.Folders.Add(folderUrlParts[0]); 
      parentFolder.Context.Load(curFolder); 
      parentFolder.Context.ExecuteQuery(); 
      if (folderUrlParts.Length > 1) 
      { 
       var subFolderUrl = string.Join("/", folderUrlParts, 1, folderUrlParts.Length - 1); 
       return CreateFolderInternal(curFolder, subFolderUrl); 
      } 
      return curFolder; 
     } 
    } 
} 
+0

上添加了它我試過這個,我得到這個消息:未處理的異常:Microsoft.SharePoint.Client.ClientRequestException:不能 聯繫站點在指定的URL https://xyz.sharepoint.com/Shared1。沒有名爲「/Shared1/_vti_bin/sites.asmx」的網站。 – MaPi

+1

我正在使用List而不是文檔庫。創建正確的應用程序允許代碼運行。你的回答指向了正確的方向,所以我會接受它作爲答案 – MaPi

1

您需要在CreateFolder方法中加載列表。

public static Folder CreateFolder(Web web, string listTitle, string fullFolderUrl) 
{ 
    if (string.IsNullOrEmpty(fullFolderUrl)) 
     throw new ArgumentNullException("fullFolderUrl"); 
    var list = web.Lists.GetByTitle(listTitle); 
    clientContext.Load(list); 
    clientCOntext.Execute(); 
    return CreateFolderInternal(web, list.RootFolder, fullFolderUrl); 
} 
+0

感謝您的答覆。我添加了這些行clientContext.Load(list); clientContext.ExecuteQuery();但我得到相同的錯誤信息 – MaPi

+0

您確定「Shared1」是您的列表的名稱嗎?你可以發佈一份列表嗎? – Diogo

+0

我在帖子 – MaPi

相關問題