Condividi tramite


当前文件夹下面有多少个文件

一不小心,理解错了别人,结果就写出了一个统计当前打开的文件夹下面,有多少个文件的一个Web Part。

索性放在网络上,和大家共享了。下面是一个简单描述:

1. 在Portal上或者WSS站点上,放置一个文档库或者一个图片库。

2. 同时,添加这个Web Part。

3. 点击文档库或者图片库中的一个文件夹。

4. 这个Web Part会把这个文件夹中有多少个文件显示出来。

实现的原理:

1. 在点击一个文档库或者图片库中的一个文件夹的时候,在IE的URL中,会出现类似下面的地址:

https://server/default.aspx?RootFolder=/doc/abc?View=xxx

2. 获得这个URL,然后解析出来:

1) Portal上的Area或者WSS站点的URL,也就是RootFolder前面的地址。

2) 具体的文档库或者图片库和其中的文件夹。也就是在RootFolder和View当中的信息。

但这里有一点:这里会包含部分Site的URL信息,需要滤掉。

3. 根据Portal上的Area或者WSS站点的URL,得到SPWeb对象。

4. 根据具体的文档库或者图片库和其中的文件夹,得到对应的文件夹。然后得到里面的文件数目。

5. 完成。

不足:

=====

肯定很多,我现在能想到的,明显的是:

1. 只能放在能添加Web Part的地方。(不是废话,而是有些地方不大好加Web Part)

2. 如果在根目录下,那么IE中的URL不会有RootFolder的信息,所以,无效。

下面是完整的代码。还是那句话,实现功能,暂时不追求别的了。

 

using System;

using System.ComponentModel;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Xml.Serialization;

using Microsoft.SharePoint;

using Microsoft.SharePoint.Utilities;

using Microsoft.SharePoint.WebPartPages;

namespace shownumber

{

      /// <summary>

      /// Description for WebPart1.

      /// </summary>

      [DefaultProperty("Text"),

           ToolboxData("<{0}:WebPart1 runat=server></{0}:WebPart1>"),

           XmlRoot(Namespace="shownumber")]

      public class shownumberpart : Microsoft.SharePoint.WebPartPages.WebPart

      {

           private const string defaultText = "";

           private string text = defaultText;

           [Browsable(true),

                 Category("Miscellaneous"),

                 DefaultValue(defaultText),

                 WebPartStorage(Storage.Personal),

                 FriendlyName("Text"),

                 Description("Text Property")]

           public string Text

           {

                 get

                 {

                      return text;

                 }

                 set

                 {

                      text = value;

                 }

           }

          

           /// <summary>

           /// This method gets the custom tool parts for this Web Part by overriding the

           /// GetToolParts method of the WebPart base class. You must implement

           /// custom tool parts in a separate class that derives from

           /// Microsoft.SharePoint.WebPartPages.ToolPart.

           /// </summary>

           ///<returns>An array of references to ToolPart objects.</returns>

// public override ToolPart[] GetToolParts()

// {

// ToolPart[] toolparts = new ToolPart[2];

// WebPartToolPart wptp = new WebPartToolPart();

// CustomPropertyToolPart custom = new CustomPropertyToolPart();

// toolparts[0] = wptp;

// toolparts[1] = custom;

// return toolparts;

// }

          

           /// <summary>

           /// Render this Web Part to the output parameter specified.

           /// </summary>

           /// <param name="output"> The HTML writer to write out to </param>

           ///

           protected override void RenderWebPart(HtmlTextWriter output)

           {

                 string pageurl = this.Page.Request.Url.ToString();

                 string renderresult;

                 int rootpos = pageurl.IndexOf("RootFolder");

                 if (rootpos != -1)

                 {

                      string siteurl = pageurl.Substring(0,rootpos-1);

      siteurl = siteurl.Substring(0,siteurl.LastIndexOf("/"));

                      string rooturl = pageurl.Substring(rootpos-1);

                      int viewpos = rooturl.IndexOf("&View");

                      rooturl = rooturl.Substring(13,viewpos-13);

                      //remove "?RootFolder=/"

                      //The following code is use to get the correct list and folder name

                      //By default after "RootFolder" there will be some additional information like "sites/sitename"

                      string tempfolder = siteurl.Substring(7);

                      int temppos = tempfolder.IndexOf("/");

                      if(temppos!= -1)

                      {

                            tempfolder = tempfolder.Substring(temppos+1);

                            rooturl = rooturl.Substring(tempfolder.Length+1);

                      }

                      int itemnum = getitemnum(siteurl,rooturl);

                      renderresult = "There are " + itemnum.ToString() + " items in this folder.";

                 }

                 else

                 {

                      renderresult = "This is one top folder. <BR>The web part does not support the function.";

                 }

                 output.Write(renderresult);

           }

           int getitemnum(string siteurl,string rooturl)

           {

                 SPWeb myweb = new SPSite(siteurl).OpenWeb();

                 SPFolder myfolder = myweb.GetFolder(rooturl);

                 SPFileCollection myitems = myfolder.Files;

                 return myitems.Count;

           }

      }

}