2016-08-31 14 views
2

WebページにSharepoint 2010ドキュメントライブラリのファイルを表示しています。私は正常にファイルとそのア​​イコンのリストを表示しています。ただし、ファイルのいくつかはサブフォルダにあり、ファイルアイコンを表示する代わりに、フォルダアイコンを表示したいと思います。Sharepointファイルがサブフォルダに含まれていることを検出する方法

ファイルがサブフォルダにあるときを検出するにはどうすればよいですか?

私は、各ファイルのServerRelativeUrlを解析してフォルダ構造を判断できました。別の方法があると私は望んでいる。ここで


は、SharePointライブラリです:

using (ClientContext clientContext = new ClientContext(SharepointSite)) 
    { 
     var query = new CamlQuery 
     { 
      ViewXml = "<View Scope='RecursiveAll'>" + 
         "<Query>" + 
         "<Where>" + 
          "<Eq>" + 
           "<FieldRef Name='FSObjType' />" + 
           "<Value Type='Integer'>0</Value>" + 
          "</Eq>" + 
         "</Where>" + 
         "</Query>" + 
         "</View>" 
     }; 

     var sourceList = clientContext.Web.Lists.GetByTitle("Test Library"); 
     var files = sourceList.GetItems(query); 
     clientContext.Load(files); 
     clientContext.ExecuteQuery(); 
     foreach (var file in files) 
     { 
      var id = file.Id; 
      var filename = file["FileLeafRef"].ToString(); 
      var iconName = clientContext.Web.MapToIcon(filename, string.Empty, IconSize.Size16); 
      clientContext.ExecuteQuery(); 
      var imgUrl = "http://sharepointsite/_layouts/images/" + iconName.Value; 
      Image iconImage = new Image {ImageUrl = imgUrl}; 

      clientContext.Load(file.ParentList); 
      clientContext.ExecuteQuery(); 
      var listUrl = file.ParentList.DefaultDisplayFormUrl; 
      HyperLink docLink = new HyperLink 
      { 
       Text = filename, 
       NavigateUrl = listUrl + "?ID=" + id //ToDo: fix 
      }; 

      HtmlTableRow row = new HtmlTableRow(); 
      HtmlTableCell cell1 = new HtmlTableCell(); 
      cell1.Controls.Add(iconImage); 
      HtmlTableCell cell2 = new HtmlTableCell(); 
      cell2.Controls.Add(docLink); 
      row.Cells.Add(cell1); 
      row.Cells.Add(cell2); 
      tbFiles.Rows.Add(row); 
     } 
    } 

library


そして、ここでは、そのライブラリ内のファイルのリストを生成したコードでありますそれはでTS:

files

のみ、リスト内の最初のファイルには、最上位のライブラリに実際にあります。残りは「テストフォルダ」にあります。

答えて

3

それはあなたのCAMLクエリのview scope性質のために利用可能なオプションを理解するために役立つかもしれない:

  • デフォルト:特定のフォルダからファイルやサブフォルダ
  • RecursiveAll取得:ファイルやサブフォルダを取得しますすべてのフォルダから
  • FilesOnly:特定のフォルダからファイル(フォルダなし)のみを取得します。
  • 再帰:あなたは階層的なフォルダ構造を維持したい場合は、次の2つのオプションがあり、すべてのフォルダ

からファイルのみ(なしフォルダ)を取得します:

  1. は、(ライブラリ内のすべてのファイルを取得します。 のビュースコープを使用して再帰的または再帰的すべて)、結果の後処理によってファイル構造を自分で再構築してください。
  2. 1つのフォールドからファイルとフォルダのみを取得してください新しいクエリを実行する(デフォルトのビューのスコープを使用して)一度にR、あなたがサブフォルダ

の内容にドリルダウンしたいときどちらのアプローチも同様に有効であるが、一般的に、私はお勧めします二番目。それらはどちらも欠点があります:最初のものは、より大きな前向きのネットワーク要求と階層を組み立てるための後処理ロジックが必要ですが、後者はすべてのデータを取得するために複数のネットワーク要求を必要とします。

CamlQueryのFolderServerRelativeUrlプロパティを目的のフォルダのURLに設定することで、2番目のアプローチを採用すると、CAMLクエリを特定のフォルダに制限できます。特定のフォルダから取得したアイテムを使用して作業する場合は、そのファイルまたはフォルダであるかどうかを確認するために、そのプロパティーのFileSystemObjectTypeを確認することができます。それらがフォルダの場合は、Folderプロパティにアクセスしてfolder objectという関連付けを取得できます。ServerRelativeUrlプロパティを使用して、そのフォルダからアイテムを取得することができます。

関連する問題