正则表达式学习

来源:互联网 发布:阿里云 大数据 编辑:程序博客网 时间:2024/06/11 07:11
正则表达式学习
引用:http://www.wangqi.com/n9250c53.aspx
http://www.cnblogs.com/zhzkl/archive/2006/10/01/519868.html


  • 基本语法

    在正则表达式中拥有一套自己的语法规则,常见语法包括;字符匹配、重复匹配、字符定位、转义匹配和其他高级语法(字符分组、字符替换和字符决策);

    字符匹配语法:

字符语法 语法解释 语法例子 /d 匹配数字(0~9) ‘/d’匹配8,不匹配12; /D 匹配非数字 ‘/D’匹配c,不匹配3; /w 匹配任意单字符 ‘/w/w’ 匹配A3,不匹配@3; /W 匹配非单字符 ‘/W’匹配@,不匹配c; /s 匹配空白字符 ‘/d/s/d’匹配3 d,不匹配abc; /S 匹配非空字符 ‘/S/S/S’匹配A#4,不匹配3 d; . 匹配任意字符 ‘....’匹配A$ 5,不匹配换行; […] 匹配括号中任意字符 [b-d]匹配b、c、d, 不匹配e; [^…] 匹配非括号字符 [^b-z]匹配a,不匹配b-z的字符;

    重复匹配语法:


重复语法 语法解释 语法例子 {n} 匹配n次字符 /d{3}匹配/d/d/d,不匹配/d/d或/d/d/d/d {n,} 匹配n次和n次以上 /w{2}匹配/w/w和/w/w/w以上,不匹配/w {n,m} 匹配n次上m次下 /s{1,3}匹配/s,/s/s,/s/s/s,不匹配/s/s/s/s ? 匹配0或1次 5?匹配5或0,不匹配非5和0 + 匹配一次或多次 /S+匹配一个以上/S,不匹配非一个以上/S * 匹配0次以上 /W*匹配0以上/W,不匹配非N*/W

    字符定位语法:


重复语法 语法解释 语法例子 ^ 定位后面模式开始位置   $ 前面模式位于字符串末端   /A 前面模式开始位置   /z 前面模式结束位置   /Z 前面模式结束位置(换行前)   /b 匹配一个单词边界   /B 匹配一个非单词边界  

    转义匹配语法: 


转义语法 涉及字符(语法解释) 语法例子 “/”+实际字符 / . * + ? | ( ) { }^ $ 例如://匹配字符“/” /n 匹配换行   /r 匹配回车   /t 匹配水平制表符   /v 匹配垂直制表符   /f 匹配换页   /nnn 匹配一个8进制ASCII   /xnn 匹配一个16进制ASCII   /unnnn 匹配4个16进制的Uniode
/c+大写字母 匹配Ctrl-大写字母 例如:/cS-匹配Ctrl+S
  • 构造正则表达的方法

    构造正则表达式需要涉及Regex类,在Regex类中包括:IsMatch()、Replace()、Split()和Match的类;

只能输入数字:"^[0-9]*$"。
只能输入n位的数字:"^/d{n}$"。
只能输入至少n位的数字:"^/d{n,}$"。
只能输入m~n位的数字:。"^/d{m,n}$"
只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。
只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。
只能输入非零的正整数:"^/+?[1-9][0-9]*$"。
只能输入非零的负整数:"^/-[1-9][]0-9"*$。
只能输入长度为3的字符:"^.{3}$"。
只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。
只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。
只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。
只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。
只能输入由数字、26个英文字母或者下划线组成的字符串:"^/w+$"。
验证用户密码:"^[a-zA-Z]/w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
验证是否含有^%&',;=?$/"等字符:"[^%&',;=?$/x22]+"。
只能输入汉字:"^[/u4e00-/u9fa5]{0,}$"
验证Email地址:"^/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*$"。
验证InternetURL:"^
http://([/w-]+/.)+[/w-]+(/[/w-./?%&=]*)?$"。
验证电话号码:"^(/(/d{3,4}-)|/d{3.4}-)?/d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
验证身份证号(15位或18位数字):"^/d{15}|/d{18}$"。
验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。
验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。
利用正则表达式限制网页表单里的文本框输入内容:

用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^/u4E00-/u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/u4E00-/u9FA5]/g,''))"

用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^/uFF00-/uFFFF] /g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/uFF00-/uFFFF]/g,''))"

用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^/d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/d]/g,''))"

用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[/W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/d]/g,''))"

得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1

s="http://www.9499.net/page1.htm"
s=s.replace(/(.*//){0,}([^/.]+).*/ig,"$2")
alert(s)

匹配双字节字符(包括汉字在内):[^/x00-/xff]

应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

String.prototype.len=function(){return this.replace([^/x00-/xff]/g,"aa").length;}

匹配空行的正则表达式:/n[/s| ]*/r

匹配HTML标记的正则表达式:/<(.*)>.*<///1>|<(.*) //>/

匹配首尾空格的正则表达式:(^/s*)|(/s*$)

String.prototype.trim = function()
{
    return this.replace(/(^/s*)|(/s*$)/g, "");
}

利用正则表达式分解和转换IP地址:

下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:

function IP2V(ip)
{
 re=/(/d+)/.(/d+)/.(/d+)/.(/d+)/g  //匹配IP地址的正则表达式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
 throw new Error("Not a valid IP address!")
}
}

不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:

var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
符号解释:

字符
描述

/
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'/n' 匹配一个换行符。序列 '//' 匹配 "/" 而 "/(" 则匹配 "("。

^
匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '/n' 或 '/r' 之后的位置。

$
匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '/n' 或 '/r' 之前的位置。

*
匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。

+
匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

?
匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。

{n}
n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

{n,}
n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

{n,m}
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

?
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

.
匹配除 "/n" 之外的任何单个字符。要匹配包括 '/n' 在内的任何字符,请使用象 '[./n]' 的模式。

(pattern)
匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '/(' 或 '/)'。

(?:pattern)
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

(?=pattern)
正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)
负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

x|y
匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

[xyz]
字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

[^xyz]
负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。

[a-z]
字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。

[^a-z]
负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。

/b
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er/b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

/B
匹配非单词边界。'er/B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

/cx
匹配由 x 指明的控制字符。例如, /cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。

/d
匹配一个数字字符。等价于 [0-9]。

/D
匹配一个非数字字符。等价于 [^0-9]。

/f
匹配一个换页符。等价于 /x0c 和 /cL。

/n
匹配一个换行符。等价于 /x0a 和 /cJ。

/r
匹配一个回车符。等价于 /x0d 和 /cM。

/s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ /f/n/r/t/v]。

/S
匹配任何非空白字符。等价于 [^ /f/n/r/t/v]。

/t
匹配一个制表符。等价于 /x09 和 /cI。

/v
匹配一个垂直制表符。等价于 /x0b 和 /cK。

/w
匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。

/W
匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

/xn
匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'/x41' 匹配 "A"。'/x041' 则等价于 '/x04' & "1"。正则表达式中可以使用 ASCII 编码。.

/num
匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)/1' 匹配两个连续的相同字符。

/n
标识一个八进制转义值或一个向后引用。如果 /n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

/nm
标识一个八进制转义值或一个向后引用。如果 /nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 /nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 /nm 将匹配八进制转义值 nm。

/nml
如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

/un
匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, /u00A9 匹配版权符号 (?)。

posted @ 2007-12-04 10:25 ◢山前◣ 阅读(12) | 评论 (1)编辑
  2007年11月23日
SPS技术体系分析(张永康)

查看完全版本论坛: SPS技术体系分析(张永康)


Pages :[1]  共 6 楼
#1 作者:胡涛 2004-11-17 16:13:00)

SPS技术体系分析(张永康)

SPS技术体系分析


张永康 2004-5-31收集整理编写



一、程序文件及IIS配置 2
二、SPS数据库对象分析 2
1.主要数据库表 3
2.主要表及字段 4
3.Windows SharePointServices存储过程 8
三、SPS封装后的对象分析 9
1.SPS主要对象体系结构 9
2.Microsoft.SharePoint命名空间简介 9
3.Windows SharePoint Services Web Service简介 13
4.SharePoint 事件分析 20
四、开发相关资源 22

......

  您还没有登陆,只能查看部分内容,欲知全文内容,请选择
[注册]或者[登陆]
#2 作者:胡涛 2004-11-17 16:14:00)


一、程序文件及IIS配置 SPS安装后的文件主要存放在如下两个目录 D://Program Files//SharePoint Portal Server 该目录主要存放服务器管理工具,搜索和索引文件数据,日志文件。 C://Program Files//Common Files//Microsoft Shared//web server extensions//60// 该目录主要存放网页相关文件(网页,程序,配置文件,图片,网页模板文件) SPS网站中上传的图片,文档及各种列表数据都存放在SQL_Server数据库中。 SPS安装好后,[控制面板]/[管理工具]中增加一个[SharePoint 管理中心],主要通过它来完成SPS的配置。它实际上是一个IIS网站,网页及程序文件在如下目录:C://Program Files//Common Files//Microsoft Shared//web server extensions//60//TEMPLATE//ADMIN//2052 它对应的IIS应用程序池名为CentralAdminAppPool (应用程序池的主要作用是为WEB程序提供进程和内存管理)

安装SPS后,默认网站会被SPS占用(默认用80端口),对应的IIS应用程序池为 MSSharePointPortalAppPool,它负责客户端浏览SPS时的进程和内存管理。所以,如果以前的IIS网站虚拟目录还需要用的话,需要修改虚拟目录的应用程序池,改为DefaultAppPool,或者,新建一个网站(虚拟服务器),启用其它的端口来访问。

#3 作者:胡涛 2004-11-17 16:14:00)


二、SPS数据库对象分析 SPS的数据存放在SQL_Server中,SQL_Server中包含三个数据库: SPS01_Config_db,SPS配置信息数据库网站名1_PROF,存储SPS个人信息网站名1_SERV,存储服务器相关信息网站名1_SITE,SPS的主数据库,站点中的文档,列表,图片基本上都存放在此数据库中。(其中“网站名”指安装SPS时指定的SPS服务器名)

1.主要数据库表 配置数据库表(10个表) Name Description 描述 AntiVirusVendors Antivirus software vendors. 防毒软件提供商。 CustomTemplates Templates that appear in the global templates list (template picker). 出现在全局模板列表中的模板(模板选取)。 Databases Content databases and associated settings. 内容数据库及相关设置。 Globals Settings that apply to all sites on the physical server within a Windows SharePoint Services topology. SharePoint架构中应用于所有物理站点的设置。 InstalledWebPartPackages Web Part Packages that are available to the virtual server. 虚拟服务器可用的web组件包。 Servers Physical computers in the Windows SharePoint Services topology. SharePoint架构中物理计算机。 Services Services such as database, Web, and mail services that are included in the Windows SharePoint Services topology. SharePoint架构中的服务,例如数据库,站点,邮件等。 Sites Sites in the Windows SharePoint Services topology. SharePoint架构中的站点。 VirtualServers Virtual servers and their associated settings. 虚拟服务器及其相关设置。 WebPartPackages Web Part Packages that are installed in a topology. 安装在架构中的web组件包。

内容数据库(29个表) Name Description 描述 Categories Associations among documents and their assigned areas. 文档及其分配区域协作。 ComMd Document discussions. 文档讨论。 Deps Document dependencies. 文档附件。 DiskWarningDate Date and time of last warning about disk quota. 最后警告磁盘配额的日期和时间。 Docs Documents and document folders. 文件和文件夹。 DocVersions Version history of documents from document libraries. 来自文档库的文档版本历史。 EventCache Cache for alerts. 警报缓存。 EventLog Log for alerts. 警报日志。 HT_Cache Cache of documents transformed for viewing in a Web browser. 浏览器文档转换视图缓存。 HT_Settings Settings for HTML viewing. HTML视图配置。 ImmedSubscriptions Alerts that are set to be sent as soon as the changes occur. 即时发送的变更通知 Links Links to be recalculated during a site recalculation. 重算过程中到重新计算的链接。 Lists Lists in the site. 站点列表。 NavNodes Nodes that are displayed in the navigation bars. 导航条显示的节点集。 Personalization Personalization done to Web Parts. 自定义web组件。 SchedSubscriptions Alerts that are set to be sent on a daily or weekly basis. 每天或每周预定发送的通知。 SiteGroupMembership Members of cross-site groups. 跨站点组成员。 SiteGroups Cross-site groups. 跨站点组。 Sites Sites in the content database. 内容数据库站点。 TimerLock Locking scheme that determines which server locks which database. 决定服务器锁锁定数据库的锁方案。 UserData List data. 列表数据。 UserInfo Info about each user added to the site. 每一个用户添加到站点的信息。 WebCat Links between Web sites and areas. 站点和区域间的链接。 WebGroupMembership List of members of the site groups. 站点组成员列表。 WebGroups Site groups (such as Administrator, Web Designer) for the site. 站点组(例如管理员,站点设计者)。 WebMembers Members of a site. 站点成员。 WebParts Web Parts available for the sites. A view is a Web Part. 站点可用的web组件。一个web组件的视图。 Webs Subsites associated with a site. 和一个站点关联的子站点。 WelcomeNames Default documents for the site. 站点默认文档。

2.主要表及字段 SPS01_config_db数据库主要存储SPS的配置信息下面对其中的5个重点表进行分析说明 AntiVirusVendors Table(AntiVirusVendors表) CustomTemplates Table(CustomTemplates表) Databases Table(Databases表) Globals Table(Globals表) Services Table(Services表)

AntiVirusVendors Table(AntiVirusVendors表) The AntiVirusVendors table stores a list of antivirus software vendors whose software is used in the Microsoft Windows SharePoint Services deployment. AntiVirusVendors表存储了SharePoint中使用的防毒软件提供商的信息。 Columns Column name Data type Description 描述 VendorID Int Unique identifier for each vendor. Part of the primary key. 提供商标识。主键组成部分。 VendorProduct nvarchar Name of the antivirus software product. Part of the primary key. 防毒软件产品名称。主键组成部分。 VendorVersion Int Version of the signature file for the antivirus software product. 防毒软件产品签名文件版本

CustomTemplates Table(CustomTemplates表) The CustomTemplates table stores the list of custom page templates that appear in the global templates list . CustomTemplates表存储了出现在全局模板列表中的自定义页面模板列表。 Columns Column name Data type Description 描述 Id int Unique identifier for the custom template. Primary key. 自定义模板标识。主键。 Title nvarchar Title of the template that displays in the template picker list box. 在模板选择列表框显示的模板名称。 Description nvarchar Description of the template. 模板描述说明。 LCID int Locale ID; for example, 1033 is English. 区域编码;例如,例如1033是英国的区域编码。 Content image Content that is applied to the site. 应用到站点的内容。 TemplateID int Template type. 模板类型。

Databases Table(Databases表) The Databases table stores content database records that list content databases and the associated settings in a Microsoft Windows SharePoint Services deployment. Each virtual server in the deployment hosts a content database. Databases表存储内容数据库(包括列表内容数据库及与其关联的SharePoint架构设置)记录。每一个虚服务器都有一个内容数据库。 Columns Column name Data type Description 描述 DatabaseId uniqueidentifier Primary key. 主键。 VirtualServerId uniqueidentifier Associated virtual server. Foreign key, available from the VirtualServers table. 关联的虚服务器。外键,来自VirtualServers表。 Name nvarchar Database name. 数据库名。 UserId nvarchar User ID used to connect to the database. Blank for Integrated Windows authentication. User ID被用来连接到数据库。如果为空则为集成windows验证。 Password nvarchar Password used to connect to the database. Blank for Integrated Windows authentication. Password用来连接到数据库。如果为空则为集成windows验证。 SiteCount int Number of sites in the database. 数据库中站点数量。 SiteCountWarning int Number of sites allowed before a warning is generated. 数据库中允许最大的站点数量。 SiteCountLimit int Number of sites allowed. 允许的站点数量。 DatabaseServiceId uniqueidentifier Foreign key, available from the Services table. 外键,来自Services表。 LastModified datetime Time of last modification to the database record. 数据库记录最新修改时间。 LastModifiedUser nvarchar User who last modified the database record. 最后修改数据库记录的用户。 LastModifiedServer nvarchar Name of the server affected by the modifications. 修改影响的服务器名称。 Status int Ready or Offline Status (0 is ready, 1 is offline). When offline, no additional sites can be created but existing sites are accessible. 就绪或离线状态(0表示就绪,1表示离线)。如果处于离线状态,除了已存在站点外不能创建其它站点创建。 Version timestamp Version of the metainfo parameter in the table. This value is incremented when a site is created and the site count is incremented. 数据表元参数版本。当一个站点被创建和站点数量增加时,这个值就会增加。 Properties ntext Not used in this table. 备用字段

Globals Table(Globals表) The Globals table stores settings that apply across a Microsoft Windows SharePoint Services deployment. Globals表存储跨越应用于SharePoint设置的设置信息。 Columns Column name Data type Description 描述 GlobalId uniqueidentifier Primary key. 主键。 SchemaVersion nvarchar Schema version of the configuration database. 配置数据库架构版本。 UseHostHeader bit Hoster Header mode settings for Windows SharePoint Services. Windows SharePoint Services的主机头样式设置。 UseNtAuthForDatabase bit 1 if Integrated Windows Authentication is being used for database access; 0 if SQL Authentication is being used. 1表示访问数据库用集成windows验证;0表示用SQL验证。 SmtpServiceId uniqueidentifier GUID for the Simple Mail Transfer Protocol (SMTP) Service specified in the global settings of SharePoint Central Administration. Foreign key (Services table). SharePoint中心管理全局设置简单邮件传输协议的GUID.外键来 MailCodePage int Option selected for character set in the SMTP Settings specified in the global settings of Central Administration. 中心管理的全局设置中SMTP设置的可选字符集选项。 FromAddress nvarchar E-mail address identified in the From field of the SMTP settings specified in the global settings of SharePoint Central Administration. 中心管理的全局设置的SMTP设置的来自域的可识别的E-mail地址。 ReplyToAddress nvarchar E-mail address that was placed in the Reply To field of the SMTP settings specified in the global settings of SharePoint Central Administration. 中心管理的全局设置的SMTP设置的回复域的可识别的E-mail地址。 LastModified datetime Time of last modification to global settings record. 全局设置的最新修改时间。 LastModifiedUser nvarchar User name of the person who last modified global settings record. 全局设置的最新修改人的用户名。 LastModifiedServer nvarchar Name of the server affected by the modifications. 修改影响的服器名。 Status int Not used in this table. 备用字段。 Version timestamp Version of the metainfo parameter in the table. This value is incremented when the UseHostHeader or SMTP Server Settings change. 表元参数版本。当用户主机头或SMTP设置变更时该值增加。 Properties ntext Miscellaneous properties for the deployment. For example, this may include metadata such as HTML viewing settings, blocked file types. 混合属性。例如,可能包括原数据,比方说HTML视图设置或者 LastModifiedServer nvarchar Name of the server affected by the modifications. 修改影响的服务器名。 Status int Not used in this table. 备用字段。 Version timestamp Version of the metainfo parameter in the table. This value is incremented when a new computer is added to the server farm. 表元参数版本。当一台新的计算机被添加到服务器工厂时,该值是就会增加。 Properties ntext Additional information about the server stored in XML format. 以xml格式存储的服务器附加信息。

Services Table(Services表) The Services table stores records for services used by the Microsoft Windows SharePoint Services deployment. Services表存储了Microsoft Windows SharePoint Services架构使用的服务记录。 Columns Column name Data type Description 描述 ServiceId uniqueidentifier Primary key. 主键。 ClassId uniqueidentifier GUID that indicates the service type such as database, Simple Mail Transfer Protocol (SMTP), or Web service. Web service corresponds to a virtual server in Microsoft Internet Information Services (IIS). GUID表明IIS服务类型,例如数据库,SMTP,Web服务,或者web服务和虚拟服务器之间的通信。 ServerId uniqueidentifier Associated server. Foreign key (Servers table). 关联的服务器。外键,来自Servers表。 Instance nvarchar Instance name of the service where a service such as the database service supports additional named instances. 服务实例名,比如数据库服务就支持附加实例名。 LastModified datetime Time of the last modification to the service record. 服务记录最新修改时间。 LastModifiedUser nvarchar User name of the person who last modified the service record. 最新修改服务记录的用户名。 LastModifiedServer nvarchar Name of the server affected by the modifications. 修改影响的服务器名 Status int Not used in this table. 备用字段。 Version timestamp Version of the metainfo parameter in the table. This value is incremented when a service changes. 表元参数版本号。当一个服务改变的时候,该值是增加的。 Properties ntext Not used in this table. 备用字段。由于SPS的开发主要通过封装的SPS对象去实现,而不是直接操作数据库对象,所以,这里没有对数据库对象(表,存储过程,触发器,约束等)进行详细研究,做了一个excel表格,该表格通过程序列出了SPS的主数据库[网站名1_SITE]中的对象,供参考。见附加excel文件。

3.Windows SharePointServices存储过程

Databases 表存储过程名称 描述 proc_putDatabase 添加或更新一条数据库记录。 proc_getDatabaseById 返回单条数据库记录。 proc_getDatabases 返回一个数据库记录集。 proc_dropDatabase 删除一条数据库记录。 Globals 表存储过程名称 描述 proc_putGlobals 保存全局设置. proc_getGlobals 返回全局设置 Servers 表存储过程名称 描述 proc_putServer 添加或更新一条服务器记录。 proc_getServerById 返回单条服务器记录。 proc_getServers 返回一个数据库记录集合。 proc_dropServer 删除一条服务器记录。 Services 表存储过程名称 描述 proc_putService 添加或更新一条服务记录。 proc_getServiceById 返回单条服务记录。 proc_getServicesByClass 返回一个服务记录集合。 proc_dropService 删除一个服务记录。 Sites 表存储过程名称 描述 proc_putSite 添加或更新一个站点记录。 proc_getSiteById 返回单条站点记录。 proc_getSites 返回一个站点记录集合。 proc_dropSite 删除一个站点记录。 VirtualServers 表存储过程名称 描述 proc_putVirtualServer 添加或更新一条虚服务器记录。 proc_getVirtualServerById 返回单条虚服务器记录 proc_getVirtualServers 返回一个虚服务器记录集合 proc_dropVirtualServer 删除一个虚服务器记录。

#4 作者:胡涛 2004-11-17 16:17:00)


三、SPS封装后的对象分析
1.SPS主要对象体系结构
以下是SharePoint可编程控制的范围。

Security, Users, and Groups Overview (安全,用户,和组的预览)
Namespaces in the Windows SharePoint Services Object Model (SharePoint对象模型的命名空间)
Programming with the Microsoft.SharePoint and Microsoft.SharePoint.Administration Namespaces (Microsoft.SharePoint和Microsoft.SharePoint.Administration命名空间)
Programming with the Microsoft.HtmlTrans.Interface Namespace (Microsoft.HtmlTrans.Interface命名空间)
Server and Site Architecture Overview (Server和Site体系结构预览)
Introduction to Templates and Definitions (模板定义和说明)
Guidelines for Templates and Definitions (模板定义和策略)
Introduction to the Windows SharePoint Services Web Service(SharePoint Web服务说明)
Guidelines for Using the Object Model (对象模型策略)
Major Schema Files(主要模式文件)

2.Microsoft.SharePoint命名空间简介
命名空间:Microsoft.SharePoint
SPSite
功能:
Represents a collection of sites on a virtual server, including a top-level site and all its subsites.
代表一个虚拟服务器的网站集合,包含一个顶集网站和他的所有子站点
AllWebs:属性表示上面意义的网站集合
Quota:网站给定某用户的限额
IISAllowsAnonymous:IIS是否允许匿名登录
PortalUrl:网站所在的门户网站的URL对于WSS网站,此项是空值
URL:网站所在的网址

SPWeb
功能:
Represents a SharePoint site.
代表SharePoint的一个网站
Alerts:所有通知的集合
AllUsers:代表所有用户对象的集合,这个用户可以是网站的用户,也可以是经过认证的域用户
Configuration:用来建立站点的配置ID,
DocTemplates:此网站所用的文档模板
EmailInsertsEnabled:取得值,表明此网站的文档库是否接收Excahnge的公共文件邮件中的附件
EventHandlersEnabled:读取此网站的文档库是否接收事件处理
Files:取得此网站根目录下所有的文件
Folders:取得此站点所有第一级文件夹
Groups:取得此站点交差站点的组
IncludeSupportingFolders:取得或设置在此站点中的文件夹或文件夹中的文件是否支持枚举
IsADAccountCreationMode:取得访问站点的用户是否自动在活动目录里建立帐户
IsRootWeb:取得此站点是否为站点集中的第一级站点
Lists:取得在此站点中所有列表的集合
Modules:取得在此站点中使用的模块
PortalMember:是否与Portal相关联
PortalSubscriptionUrl:一直URL供Portal 中的Alerts
PresenceEnabled:取得或设置是否为记录用户在线信息
Properties:属性集合,此集合中包含WSS的版本或地域信息
PublicFolderRootUrl:取得文档库接收公共文件夹中邮件附件的URL
Roles:取得站点的用户组
SiteGroups:取得网站集合的交差网站组
SiteUsers:取得站点集合的所有用户
Users:取得此站点的用户集合
Microsoft.SharePoint.SPWeb.ViewStyles:取得站点的视图样式
Webs:取得在此站点以下所有子站点的集合

SPAlert
功能:
Represents an alert, which generates periodic e-mail notifications sent to a user about the list, list item, document, or document library to which the alert applies.
代表一个通知,它产生一个定期的e-mail通知发送到用户那里,发更新与此通知关联的列表,列表项,文档,文档库等的消息
SPAlertFrequency:通知发生的频率,分别为每天一次,每周一次,立即发送
SPEventType:事件类型:全部,删除,增加,讨论,修改
Item:此通知属于的列表项或文档
List:此通知所属的列表或文档库
User:得到通知的人

SPList
Represents a list on a SharePoint Web site.
功能:代表SharePoint 网站中的一个列表
AllowDeletion:此列表是否允许删除
AllowMultiResponses:指定调查是否允许多次答复,由此可见,调查属于列表的一种
AnonymousPermMask:是否允许匿名用户访问
BaseTemplate:说明列表基于的模板类型,模板类型有通知、联系人、自定义表格、数据源、讨论板、文档库、事件、自定义列表、不合法列表、问题跟踪、链接、列表模板库、图片库、调查、任务、Web部件库、网站模板库、Xml表格库
BaseType:列表的基本类型,类型有:讨论板、文档库、自定义列表、问题跟踪、调查、无类型、没有使用的
DefaultView:默认视图
Direction:阅读的方向
EnableAttachments:是否允许添加附件
EnableModeration:是否需要审批
EnableVersioning:是否支持版本
EventSinkAssembly:支持事件通知程序集的强名称
EventSinkClass:支持事件通知类名称
EventSinkData:文档库的事件通知中定义的任意字符串
ExcludeFromTemplate:当列表被存成模板时,是否包含内容
Fields:列表中字段的集合
Forms:在列表中用来显示、编辑、增加列表项的表格集合
Hidden:此列表是否隐藏
ImageUrl:列表的图标的服务器相对地址
ItemCount:列表项的数目
Items:列表项集合
Lists:该列表所在的列表集合
MultipleDataList:指定这个在会议工作区中的列表,是否包含多个会议的实例
OnQuickLaunch:是否有首页的快速启动中显示
Ordered:是否允许用户重新对列表项排序
ParentWeb:列表属于的父网站
Permissions:权限集合
PropertiesXml:协作应用标记语言,代表列表的属性值
ReadSecurity:阅读权限设置
RootFolder:取得在列表中包含所有文件的文件夹
SchemaXml:取得此列表的Xml样式
ShowUser:是否在调查中是否显示用户名称
Views:此列表所有视图集合
WriteSecurity:指定写入设置

SPListEvent
Represents an event that occurs within a document library.
功能:代表文档库内发生的事件
ListID:事件发生的文档库的GUID
PropertiesAfter:事件发生后文档库状态属性
Type:事件类型:签入、签出、复制、删除、插入、不合法、剪切、撤消签出、更新
UrlAfter:返回文档或文件夹的网站相对地址,在任何事件发生时,除了删除事件
UserDisplayName:引发事件的用户的显示名称
UserID:引发事件的用户ID
UserLoginName:引发事件的用户登录名称
WebUrl:事件发生的网站的绝对URL

SPListItem
功能:
Represents an item, or row, in a list.
代表列表中的一个列表项或者一行
Attachments:与列表项关联的附件
Fields:列表项所在的列表字段集合
File:由列表所代表的文档库中的文件
ListItems:所在的父列表
ModerationInformation:审批信息,包含状态和描述
ParentList:所在父列表
Xml:列表中的数据的Xml格式

SPIssueList
此类从SPList继承
功能:表示一个问题列表
EnableAssignedToEmail:当列表项与用户关联时,是否发送e-mail通知

SPField
功能:
Represents a field in a list on a SharePoint Web site.
代表SharePoint网站中列表的一个字段
CanToggleHidden:取得此字段是否可以通过用户界面隐藏
DefaultFormula:计划字段的默认公式
Direction:阅读顺序
DisplaySize:显示大小
FieldReferences:一个字符数组,表示字段引用计算机中的字段名称
Filterable:表明此字段是否可以过滤
FilterableNoRecurrence:取得是否可以在视图中的字段建立过滤,却不引发重复的事件
FromBaseType:是否从基本字段产生
Hidden:是否在视图中显示
InternalName:内部名称
ParentList:包含字段的列表
ReadOnlyField:此字段是否可以修改
Reorderable:在字段中的值是否可以重排序
Required:决定此字段是否为必须的
Sealed:此字段是否可以被其它字段继承
Sortable:是否可以被排序
Type:字段类型:TypeAsString:字段的名称的字符


3.Windows SharePoint Services Web Service简介
Administration Service
Administration Web服务提供了WSS网站管理,例如创建和删除站点等。
提供了4个方法:
(1)、CreateSite(string,string,string,int,string,string,string,string,string,string)
创建一个网站Url,包括站点集合的一个绝对URl。目前不能创建根节点,只能在
http://Server_name/sites/site_name.aspx
Title 此字符串包含网站集合的显示名
Description 表示网站集合的描述
Lcid 网站集合的本地标识。英文版为1033,中文版为2052
WebTemplate 表示网站模版字符串为:STS#0, STS#1, STS#2
OwnerLogin 网站的拥有者(DOMAIN//User_Alias)
OwnerName 网页上显示的名字.
OwnerEmail 网站所有者的Email地址.
PortalUrl A string that contains the URL of a portal for the site collection.
PortalName A string that contains the name of a portal for the site collection.

(2)、DeleteSite(string)
Url:要删除的网站的绝对Url
(3)、GetLanguages()
返回显示的语言信息
(4)、GetLanguages(GUID,bool)更新虚拟服务器的Cache配置信息。
VirtualServerId 虚拟服务器的表示符
AdminGroupChanged:true表示指定的管理员组改变配置。

Alerts Service
提供对SharePoint 站点列表通知的操作
提供方法:GetAlerts() 为当前站点返回所有通知(注:此方法目前有些不太明白,他并没有返回我们所想要的信息)
DeleteAlerts(string)删除指定的通知

List Data Retrieval Service
提供一个方法,对SharePoint Service 的一个列表进行查询
Request(QueryRequest)(quertRequest的select属性有问题)

Document Workspace Service
提供了一些方法,对文档工作区及其内容进行管理
(1)、CanCreateDwsUrl(String) 确定用户是否有在服务器上建立子站点的权限
返回值String,如果为:HTTP error code 401表示用户没有足够的权限!

(2)、CreateDws(string,string,string,string)
Name:新的文档工作站的名字,可选,如果不写的话按网站标题名命名。
Users:向SharePoint站点增加的新的用户信息。
Title:新的文档工作去的标题。
documents:An optional list of documents, in the format <Documents><item ID="{document ID}" Name="{document name}"/>...</Documents>, for Microsoft Windows SharePoint Services to retain for subsequent calls to the FindDwsDoc method. Used by Microsoft Office Outlook 2003 when adding shared attachments to a new Document Workspace site.
Error Code Description
HTTP error code 401 The user does not have sufficient rights.
DWSError.AlreadyExists (13) 指定的Url已存在.
DwsError.QuotaExceeded (14) 这个操作超出了用户权限.

(3)DeleteDws()
删除当前的文档工作区
Error Code Description
DWSError.NoAccess (3) 用户没有足够的权限删除此文档
DWSError.WebContainsSubwebs (11) 此文档工作区包含子站点

(4)CreateFolder(string) 创建文件夹, 如果返回值为空表示创建成功
url:创建文件夹的名字,例如:Shared Documents/folder_name.,不能创建根文件夹。
Error Code Description
DWSError.NoAccess (3) 用户没有足够的权限.
DWSError.FolderNotFound (10) 父文件夹不存在.

(5)DeleteFolder(string)删除文件夹。
Url:要删除的文件夹的名字。
Error Code Description
DWSError.NoAccess (3) 用户没有足够的权限完成此操作.
DWSError.FolderNotFound (10) 文件夹不存在

(6)FindDwsDoc(string)此方法返回一个在文档库中显示的文档URL。
Id (string),文档的唯一标识符(GUID),注:有些疑难,还是没找到文档的表示符。所以返回有错误

(7)GetDwsData(string,String)返回文档工作区所在站点及其包含的列表的信息
Document:在文档工作区站点上,文档库所包含的一个文档如:"Shared Documents/document_name.doc."
Lastupdata: 可以写入调用GetDwsData()方法或GetDwsMetadata ()方法后产生的值,也可以空着。

(8)GetDwsMetaData(string,string,bool)返回文档工作区站点及其包含的列表的信息
Document:在文档工作区站点上,文档库所包含的一个文档如:"Shared Documents/document_name.doc."
id ,可选,文档的Guid,
minimal Boolean:决定文档站点信息的输出是否包含schemas, lists, documents, links, and tasks lists等信息。
Return Value
String An XML document fragment that contains the following information:
SubscribeUrl
MtgInstance (meeting instance, if applicable)
SettingsUrl (site settings URL)
PermsUrl (edit permissions url)
UserInfoUrl (user information url)
Roles
[Schema items] (if Minimal is False)
[ListInfo items] (if Minimal is False)
Permissions
HasUniquePerm (true/false)
WorkspaceType ("DWS", "MWS", "SPS", "")
IsADMode (true/false)
DocUrl
Minimal (true/false)
Results (data returned by the GetDwsData method)

(7)和(8)区别不是太明显,但有那么一点区别,(8)包含所有显示的文档、列表等信息,但(7)不包含。
(9)RemoveDwsUser(string)在列表中移出指定的用户
Id:用户ID

#5 作者:胡涛 2004-11-17 16:18:00)


(10)RenameDws (string)改变当前文档工作区的标题
Title:当前文档工作区的新标题
Versions Service
DeleteAllVersions(string)删除指定文件的所有版本,(除最新版本外)
File_name版本被删除的文件的名字如shared documents/file_name
DeleteVersion(string,string)删除指定文件的制订版本
File_name string版本被删除的文件的名字如shared documents/file_name
File_Vesion 此文件的指定版本(版本号从”1”开始)此版本必须存在,否则会发生错误。
XmlNode GetVersions(string)以XMl 格式返回指定文件的所有版本信息。
RestoreVersion(string,string)导入以有版本的文件。
File_name string版本被删除的文件的名字如shared documents/file_name
File_Vesion 此文件的指定版本(版本号从”1”开始)此版本必须存在,否则会发生错误。


Lists Service
为列表及其列表数据提供操作的方法。
AddAttachment(string,string,string,byte[])为指定的列表项增加属性文件
ListName:列表的Guid或列表名
ItemId:要增加属性列表的Item Id
filename:要上传的文件的文件名
content:此文件的二进制数组
AddList(string,string, int )在当前站点下增加一个列表
listName:列表名
description:对此列表的描述
templateId:使用的模版ID号。
可用的模版ID号如下:

List Display Name Type
通知 104
联系人 105
自定义列表 100
在数据表中自定义列表 120
DataSources 110
讨论版 108
文档库 101
事件 106
表单 115
问题跟踪 1100
链接 103
图片库 109
调查 102
任务 107

DeleteAttachment(string,string,string)
Listname:列表名
ItemId:列表的Item Id
DesUrl:包含属性文件的绝对Url如:
http://Server_Name/Site_Name/Lists/List_Name/Attachments/Item_ID/FileName.
在此情况下,可以用程序获得的此Url
XmlNode ndAttach = listService.GetAttachmentCollection("List_Name", "1");
XmlNodeList ndsAttach = ndAttach.ChildNodes;
for (int i=0; i<ndsAttach.Count; i++)
{
string delUrl = ndsAttach[i].InnerText;
listService.DeleteAttachment("List_Name", "1", delUrl);
}

DeleteList(string)删除指定的列表
ListName:列表名
XmlNode GetAttachmentCollection(string,string)返回列表指定Item的属性集合的Urls
ListName:列表名
ItemId:此列表的ItemId。
xmlNode GetList(string)以XML格式返回指定的列表
listname 列表名
xmlNode GetListAndView(string,string)以xml格式为指定列表返回链接和视图
listname:列表名
viewname:试图名
xmlNode GetListCollection()返回一个站点所有列表的名字和GUID
xmlNode GetListItemChanges(string,System.Xml.XmlNode,string,System.Xml.XmlNode)
listname:列表名
viewFields :A ViewFields element that specifies which fields to return in the query and in what order, and that can be assigned to a System.Xml.XmlNode object
since A string that contains the date and time in Coordinated Universal Time (UTC) ISO8601 format from which to start retrieving changes in the list. The value of this parameter is typically retrieved from a prior SOAP response. If this value is null, the query returns all items in the list
contains A Contains element that defines custom filtering for the query and that can be assigned to a System.Xml.XmlNode object,


Meetings service
提供了创建和管理会议工作区的方法。
System.Xml.XmlNode AddMeeting ( String organizerEmail , String uid , UInt32 sequence , System.DateTime utcDateStamp , String title , String location , System.DateTime utcDateStart , System.DateTime utcDateEnd , System.Boolean nonGregorian )在会议工作区增加一次会议
organizerEmail:会议组织者的Email地址 格式:
email_address@domain.ext
uid:日历组件的GUID
sequence:一个int值,用来决定更新顺序,如果顺序与当前顺序相同,将应用最新的更新。
utcDateStamp:实例化iCalender的日期和时间
title:会议标题
location: 会议地点
utcDateStart:会议开始的日期和时间 (以UTC格式表达)
utcDateEnd:会议结束的日期和时间 (以UTC格式表达)
nonGregorian:如果日期的设置格式不同于Gregorian为true,否则false
System.Xml.XmlNode AddMeetingFromICal (String organizerEmail , String icalText )在Wss中,使用会议工作区创建一个网络、日历格式的会议
organizerEmail:会议组织者的Email
icalText:iCal(Internet Calendar)代表了与此会议工作区相关的会议
System.Xml.XmlNode CreateWorkspace (String title , String templateName ,UInt32 lcid , WssWebService.Meeting.TimeZoneInf timeZoneInformation )在指定的Wss服务器上建立一个新的会议工作区自站点。
Title:新的会议工作区的标题
templateName:建立新的会议工作区所使用的模版,可以用过查看Wss模版使用指南来指定配置模版
lcid:站点建立时您想使用的Lcid(Local identifier)
timeZoneInformation:站点建立时,您想使用的时间区域信息
void DeleteWorkspace()从指定的Wss服务器上删除会议工作区
System.Xml.XmlNode GetMeetingsInformation ( System.UInt32 requestFlags ,UInt32 lcid )此方法列出了Wss服务器上支持的语言和模版 信息。同时指出了调用者在此会议工作区内是否有管理子站点的权限。例如:匿名访问权限等。
Lcid:您想限制的结果集的本地Id (local identifier)
requestFlags:可能是一个或多个下面的标记
canCreateMeetings:返回ture or false 表明是否有ManageSubSite的权限
templateLanguages:返回列表可用的语言模版
templateList:返回本地会议工作区可用的模版
workspacestatus:返回会议工作区的信息
System.Xml.XmlNode GetMeetingWorkspaces ( System.Boolean recurring )在指定的站点上返回所有会议工作区的列表。
Recurring:true表示会议可重复。
void RestoreMeeting ( System.String uid )导入并重新链接一个以前移除的会议。
Uid:日历组件的GUID
Void SetAttendeeResponse (String attendeeEmail , System.UInt32 recurrenceId , String uid , System.UInt32 sequence , System.DateTime utcDateTimeOrganizerCriticalChange , System.DateTime utcDateTimeAttendeeCriticalChange , WssWebService.Meeting.AttendeeResponse response )设置与会者的应答信息。
attendeeEmail The e-mail address, specified as
email_address@domain.ext, for the responding user.
recurrenceId The recurrence ID for the meeting. For single instance meetings, this parameter can be set to zero.
response The response from the responding user (responseAccepted, responseTentative, or responseDeclined).
sequence An integer used to determine the ordering of updates in case they arrive out of sequence. Updates with a lower-than-current sequence are discarded. If the sequence is equal to the current sequence, the latest update will be applied.
uid A persistent GUID for the calendar component.
utcDateTimeOrganizerCriticalChange This parameter is ignored in this release, therefore, this parameter can be a default date time.
utcDateTimeAttendeeCriticalChange The date and time that the instance of the attendee object was created, expressed in Coordinated Universal Time
void SetWorkspaceTitle ( System.String title ) 设置会议工作区的标题
title:新的标题!
void UpdateMeeting ( System.String uid , System.UInt32 sequence , System.DateTime utcDateStamp , System.String title , System.String location , System.DateTime utcDateStart , System.DateTime utcDateEnd , System.Boolean nonGregorian )在会议工作区内更新会议的信息
uid:日历组件的Guid
sequence An integer used to determine the ordering of updates in case they arrive out of sequence. Updates with a lower-than-current sequence are discarded.
utcDateStamp The date and time that the instance of the iCalendar object was created in UTC format.
Title:会议标题
Location:会议地址
utcDateStart:会议开始的日期和时间 (以UTC格式表达)
utcDateEnd:会议结束的日期和时间 (以UTC格式表达)
nonGregorian:如果日期的设置格式不同于Gregorian为true,否则false
System.Xml.XmlNode UpdateMeetingFromICal ( System.String icalText , System.Boolean ignoreAttendees )
icalText The iCal representation of the updated meeting.
ignoreAttendees true if you want to skip processing of attendee information in the iCal; otherwise, false.


Permissions service
为一个站点或列表提供权限的管理
AddPermission()为站点上已存在的用户组修改权限级别,或者增加或修改指定列表的用户、用户组、跨站点用户组的访问权限。
AddPermissionCollection()为一个站点或列表的权限结合增加一些权限
GetPermissionCollection()返回站点或列表的权限集合
RemovePermission()从站点或列表中移出指定的权限
RemovePermissionCollection()从站点或列表中移出指定成员的访问权限。
UpdatePermission()为站点或列表修改指定的权限

Site Data service
返回站点的原数据或者列表的原数据
EnumerateFolde()返回一个文件夹里的文件或自文件夹的信息
GetAttachments()返回SharePoint 站点中列表的指定项的所有附件
GetList()返回指定 列表的源数据
GetListCollection()返回当前站点的所有列表信息
GetListItems()对指定的列表执行一次查询。
GetSite()返回站点的原数据、当前站点集合中子站点的信息,站点上跨站点用户组的信息,以及每个用户组的成员
GetSiteAndWeb()返回指定站点的子站点的绝对Url以及 高一级的父站点的Url
GetWeb()返回站点及列表的元数据,以及当前站点及站点用户组的信息。

Sites Service
在虚拟服务器上,返回站点模版集合的信息
GetSiteTemplates()返回精确的站点集合的信息,以及虚拟服务器上站点的模版

Users and Groups Service
提供了用户、用户组、跨站点用户组的工作
AddGroup()向当前站点集合中增加一个跨站点用户组
AddGroupToRole()向指定的站点增加一个跨站点用户组。
AddRole()向当前站点集合中增加一个站点用户组
AddUserCollectionToGroup()向指定的跨站点用户组增加一个用户集合
AddUserCollectionToRole()向指定的用户组增加

Views Service
提供列表试图的工作方法
AddView()为指定的列表 增加一个试图
DeleteView()删除指定列表的指定试图
GetView()获取指定列表的制定试图的架构
GetViewCollection()返回指定列表的试图集合的显示名、内部名、以及Urls
GetViewHtml()返回指定列表制定试图的完整的架构,包括Html部分
UpdateView()修改指定列表的指定试
UpdateViewHtml()用提供的属性及值修改指定的视图,包括:CAML的显示属性及HTML


Web Part Pages Service
从XML Web Service 获取数据或者给XML Web Service 发送数据
AddWebPart()向WebPart 页面中增加一个新的WebPArt
DeleteWebPart()删除一个WebPart
GetWebPart()返回WebPart的XML数据
GetWebPartCrossPageCompatibility()在目标网页上返回所有的WebPart的相容性providerPartID信息
GetWebPartPageConnectionInfo()返回在同一页面中包含的 所有部分的接口及组信息以及各部分之间的相容性信息
GetWebPartPageDocument()返回一个WebPart页面,连同WebPart、属性、以及各个WebParts区域信息
GetWebPartProperties()返回一个Webpart 页面所有的WebPart的XMl字符串
GetXmlDataFromDataSource()Returns the XML from a data retrieval service
SaveWebPart()保存对WebPart的更改
GetAllSubWebCollection()

Webs Service
提供对站点或子站点的工作方法。
GetAllSubWebCollection()在当前的站点集合中返回所有站点的标题和Urls
GetListTemplates()返回当前站点模版的集合
GetWeb()返回一个站点的属性(例如:Name、description、theme等)
GetWebCollection()返回当前站点的所有子站点的标题和Url
WebUrlFromPageUrl()返回指定页面上一级页面的URL

4.SharePoint 事件分析
主要功能:
(1) 提供共享信息
(2) 在选定的时间段内周期性的执行事务
(3) 可以与Outlook结合发送通知
属性描述
属性描述:
? 标题(Title):事件的标题
? 事件创建者(EventCreater):事件的创建者
? 用户群体(EvnetUserGroup):与此事件相关的人员
? 开始时间(StartTime):事件开始执行的时间
? 结束时间(EndTime):事件执行结束时间
? 事件说明(EventDescription):对此次事件的说明
? 事件发生地点(EvnetAddress):事件发生的地点
? 事件执行周期描述:
? 无模式:在指定的时间上执行一次就结束
? 每日:可以选择每隔几天发生一次
? 每周:可以选择星期几发生
? 每月:可以选择每隔几个月第几天发生;也可以选择每隔几个月的第几个星期几发生。
? 每年:
? 以上(除无模式)都可以选择总共发生的次数;结束日期;或者无结束日期
用户界面
? 事件列表
(1) 提供事件标题、创建人、创建日期、以及事件描述
(2) 提供对事件的操作按钮如:创建、删除、编辑、导出,发送事件信息等
(3) 事件查询:根据不同的筛选条件查询事件
? 新建事件界面:(空白模式)列出所有要填写的信息
? 编辑事件界面(重现以上界面,但要读出以前填写的信息)
? 日历表形式界面(显示一个日历)
? 发送通知界面(给相关人员发送通知)
? 查看事件信息
流程
(1):填写事件信息
组件
(1) 事件访问组件(提供增加事件,删除事件(判断权限)、修改事件、以及根据不同条件选择事件)
(2) 事件触发组件(首先读取当天要发生的事件,在检测发生时间)
(3) 导入OutLook,自动发送邮件
数据访问
(1)提供增、删、改、查等功能。
数据层
(1) 事件信息表(EventInfomation)
EventId int 事件编号
Title varchar(200) 标题
Creater int 创建者Id
Usergroup int 用户群体Id
EventDescription varchar(500) 事件说明
EventAddress varchar(500) 事件发生地
LastModificationTime DateTime 最近修改时间
EventType int 事件类型号

(2) 事件发生时间和发生周期(EventExcute)
EventId int 事件Id
StartTime DateTime 开始时间
EndTime DateTime 结束时间
EventPeriod 特定描述字符串例如:SPPS数据库中描述的<recurrence><rule><firstDayOfWeek>su</firstDayOfWeek><repeat><daily dayFrequency=/'1/' /></repeat><repeatInstances>10</repeatInstances></rule></recurrence> 发生周期
RepeatNum int 事件发生次数(-1)为无限制
或者按结束时间计算。为(0)事件结束
(3) 事件附件表(EventAttachment)
AttachmentId int 附件ID
AttachmentPosition varchar(100) 附件存储位置
EventId int 附件所属事件Id
(4) 事件类型表
EventTypeId int 事件类型
TypeDescription varchar(500) 类型描述
TypeTitle varchar(200) 类型标题

(5) SORT用户表
(6) SORT用户群体表
视图
(1)事件细节(EventDetial):合并表(1~3)主要功能是提供读取事件信息用的
存储过程:
(1) sp_AddEvent(所有需要填写的参数)
(2) sp_AddAttachment(增加附件)
(3) sp_DeleteEventById(级联删除事件所有信息)
(4) sp_UpdataEvent(修改事件)
(5) sp_SelectEventByTitle(根据标题选择事件)
(6) sp_SelectEventByCreater(根据创建者选择事件)
(7) sp_SelectEventByCreateTime(根据创建时间选择事件)
(8) sp_SelectEventByAddress(根据地点选择事件)

#6 作者:胡涛 2004-11-17 16:18:00)


四、开发相关资源
开发工具:VS.NET 2003,另需外加SPS开发工具包
WebPart Templates for VS.NET
http://www.microsoft.com/downloads/details.aspx?FamilyID=cac3e0d2-bec1-494c-a74e-75936b88e3b5&DisplayLang=en

spswebpartdeveloper


1. WEB部件开发
方法见
http://blog.joycode.com/kaneboy/posts/21140.aspx
http://blog.joycode.com/joy/posts/20523.aspx
2. 流程定制开发
方法见
http://blog.joycode.com/kaneboy/posts/21800.aspx
http://www.erist.com/Articles/ShowArticle.aspx?ArticleID=183
3. Office Research Service开发
方法见
http://blog.joycode.com/kaneboy/posts/13869.aspx
http://blog.joycode.com/joy/posts/16105.aspx


SPS开发相关站点
论坛
http://msd2d.com
http://www.skillart.com/bbs/index.asp

博客站
http://blog.joycode.com/kaneboy/
http://dog.xmu.edu.cn/index.php

MSDN开发资料
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odc_sp2003_ta/html/sharepoint_northwindwebparts.asp
SharePoint Service 2003 SDK
http://www.microsoft.com/downloads/details.aspx?FamilyID=1c64af62-c2e9-4ca3-a2a0-7d4319980011&DisplayLang=en

国内的开发者站点:
情升网络
http://www.erist.com/Articles/ChannelIndex.aspx?ChannelID=9
技艺网络http://www.skillart.com/News/2j.asp?id=62



版权所有:中联信息 2000-2006
posted @ 2007-11-23 17:27 ◢山前◣ 阅读(35) | 评论 (1)编辑
  2007年11月12日
向SPS列表中添加附件
怎样向一个列表添加附件呢?
查了很多资料,最后在wss的SDK上找到答案。
代码如下:
PSite site = SPContext.Current.Site;
SPWeb srcSite = site.AllWebs["Site_Name"];

SPFile file = srcSite.Folders["Folder_Name"].Files["File_Name"];

SPList list = srcSite.Lists["Announcements"];
SPListItem listItem = list.Items[5];

SPAttachmentCollection attachments = listItem.Attachments;

string fileName = file.Name;

byte[] binFile = file.OpenBinary();

attachments.Add(fileName, binFile);

listItem.Update();
posted @ 2007-11-12 16:16 ◢山前◣ 阅读(11) | 评论 (0)编辑
在SharePoint中对文档库(列表)进行的一些操作
     摘要: 以下是我在开发SharePoint过程中写的对文档库和列表进行的一些基本操作,先写下来,日后在加。 using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using Sys...  阅读全文
posted @ 2007-11-12 15:23 ◢山前◣ 阅读(65) | 评论 (0)编辑
C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据

using Microsoft.SharePoint;

SPWeb site 
=
 SPControl.GetContextWeb(Context); 
SPListItemCollection items 
= site.Lists["ListName"
].Items;

SPListItem item 
=
 items.Add(); 

item[
"Field_1"=
 OneValue;

item[
"Field_2"=
 TwoValue;

item.Update();


删除sharepoint list数据
=============================================

using Microsoft.SharePoint;

SPWeb site 
=
 SPControl.GetContextWeb(Context);

SPListItemCollection items 
= site.Lists["ListName"
].Items;

items[
0
].Delete();


上传文件到sharepoint
=============================================

using System.IO;

using
 Microsoft.SharePoint;

if( htmlInputFile1.PostedFile != null
 )
{
          SPWeb site 
= new
 SPSite(destinationURL).OpenWeb(); 
          Stream stream 
=
 htmlInputFile1.PostedFile.InputStream;

          
byte[] buffer = new
 bytes[stream.Length];

          stream.Read(buffer, 
0, (int
) stream.Length);

          stream.Close();

          site.Files.Add(destinationURL, buffer);
}


查询记录及更新数据
===============================================
using Microsoft.SharePoint;

SPWeb web 
= new SPSite("http://nick").OpenWeb("test");  //Open website


web.AllowUnsafeUpdates 
= true;

SPList list 
= web.Lists["ListName"
];

SPQuery query 
= new
 SPQuery();

query.Query 
= "<Where>"+

          
"<And><And>"+
          
"<Eq><FieldRef Name=/"Filed_1/"/><Value Type=/"Text/">Test</Value></Eq>" +
          
"<Eq><FieldRef Name=/"Filed_2/"/><Value Type=/"Text/">" + (string)OneValue + "</Value></Eq>" +
          
"</And>"+
          
"<Eq><FieldRef Name=/"Filed_3/"/><Value Type=/"Text/">" + (string)TwoValue + "</Value></Eq>" +
          
"</And>"+
          
"</Where>";

query.RowLimit 
= 10
;

//查询

SPListItemCollection items = list.GetItems(query);
try

{
  
if (Items.Count != 0
)
  
{
     
//更新sharepoint list 数据

     foreach (SPListItem list in listItems)
     
{
         list[
"Filed_1"=
 TextBox1.text.ToString();
         list[
"Filed_2"=
 TextBox2.text.ToString();
         list[
"Filed_3"=
 TextBox3.text.ToString();

         listItem.Update();
     }
                       
  }

  
else
  
{   //将数据记录添加进sharepoint
      SPListItem addlist = List.Items.Add();

      addlist[
"Filed_1"=
 TextBox1.Text.ToString();
      addlist[
"Filed_2"=
 TextBox2.Text.ToString();
      addlist[
"Filed_3"=
 TextBox3.Text.ToString();

      addlist.Update();
  }

}

catch
{
 
}


转自:http://www.cnblogs.com/jhobo/archive/2007/06/06/773650.html
posted @ 2007-11-12 15:21 ◢山前◣ 阅读(26) | 评论 (0)编辑
  2007年11月9日
如何用Asp.Net来实现“网络硬盘”功能
如何用Asp.Net来实现“网络硬盘”功能
所谓“网络硬盘”,即将服务器的磁盘空间提供给用户使用,用户可以通过这种方式在互联网上实现文件的转移和备份。通过网络硬盘,不仅可以备份电脑系统文件,且可以轻松实现移动化办公,你可以随时随地进行个人文件的上传、下载、删除及文件目录的创建、删除等操作,还可以实现文件网络共享、网络文件快递、快速下载通道等。也就是说,只要你愿意的话,就可以与网络上的所有人共享存放在网络硬盘上的文件。当然,如果自己不愿意的话,那谁也看不到你的文件。和 E_Mail不同的是,网络硬盘侧重于个人文件的存储、共享、发送等各式网络文件管理。这样就可以突破E-mail的附件中对文件大小的限制。

通过了解“网络硬盘”的概念可以发现,实际上它的要求就是在客户端来完成对服务器系统文件或文件夹的访问、创建和删除等功能。而Asp.Net在这方面有着很大的优势。

本章将就如何用Asp.Net来实现“网络硬盘”功能做详细的探讨。网络硬盘的功能包括很多项,我们要提供的包括以下几个方面:

l         查看文件夹内容

l         文件夹的创建及相关属性的设置

l         文件夹间跳转

l         上传文件到指定文件夹

l         下载文件到本机或在线查看文件内容

l         删除文件或文件夹

经过本章的学习,您将能够在个人网站中提供“网络硬盘”功能,为广大的用户提供“移动秘书”服务,从而扩大自身网站的知名度。

File类和Directory类
要进行“网络硬盘”功能设计,首先要熟悉.NET中处理文件和文件夹的操作。File类和Directory类是其中最主要的两个类。了解它们将对后面功能的实现提供很大的便利。

System.IO.File类和System.IO.FileInfo类
主要提供关于文件的各种操作,使用时需要引用System.IO命名空间。下面通过程序实例来介绍其主要属性和方法。

●     文件打开File.Open

public static FileStream Open(

   string path,

   FileMode mode

);

下面的代码打开c:/tempuploads/newFile.txt文件,并写入hello。

private void OpenFile()

{

FileStream.TextFile=File.Open(@"c:/tempuploads/newFile.txt",

FileMode.Append);

byte [] Info = {(byte)'h',(byte)'e',(byte)'l',(byte)'l',(byte)'o'};

TextFile.Write(Info,0,Info.Length);

TextFile.Close();

}

●     文件创建File.Create

public static FileStream Create(

   string path

);

下面的代码创建了c:/tempuploads/newFile.txt文件。

由于File.Create方法默认向所有用户授予对新文件的完全读/写访问权限。

文件是用读/写访问权限打开的,必须关闭后才能由其他应用程序打开。

所以使用了 FileStream的Close方法将创建的文件关闭。

private void MakeFile()

{

FileStream NewText=File.Create(@"c:/tempuploads/newFile.txt");

NewText.Close();

}

●     文件删除File.Delete

public static void Delete(

   string path

);

下面的代码将c:/tempuploads/newFile.txt文件删除。

private void DeleteFile()

{

File.Delete(@"c:/tempuploads/newFile.txt");

}

●     文件复制File.Copy

public static void Copy(

   string sourceFileName,

   string destFileName,

   bool overwrite

);

下面的代码复制c:/tempuploads/newFile.txt到c:/tempuploads/BackUp.txt。

由于Cope方法的OverWrite参数设为了true,所以若BackUp.txt文件已存在,将会被复制的文件覆盖。

private void CopyFile()

{

File.Copy(@"c:/tempuploads/newFile.txt",@"c:/tempuploads/BackUp.txt",true);

}

●     文件移动File.Move

public static void Move(

   string sourceFileName,

   string destFileName

);

下面的代码将文件c:/tempuploads/BackUp.txt移动到

c:/tempuploads/BackUp2.txt

private void MoveFile()

{

File.Move(@"c:/tempuploads/BackUp.txt",@"c:/tempuploads/BackUp2.txt");

}



●     设置文件属性File.SetAttributes

public static void SetAttributes(

   string path,

   FileAttributes fileAttributes

);

下面的代码设置文件c:/tempuploads/newFile.txt的属性为只读,隐藏。

private void SetFile()

{

File.SetAttributes(@"c:/tempuploads/newFile.txt",

FileAttributes.ReadOnly|FileAttributes.Hidden);

}

文件除了只读和隐藏常用的属性还有

Archive(文件存档状态),System(系统文件),Temporary(临时文件)等

关于文件属性的详细情况请参看MSDN中FileAttributes中的描述。



●     判断文件是否存在File.Exist

public static bool Exists(

   string path

);

该代码判断是否存在c:/tempuploads/newFile.txt文件。

若存在,先复制该文件,然后其删除,最后将复制的文件移动。

若不存在,创建该文件,打开文件,写入。然后将文件属性设为只读,隐藏。

if(File.Exists(@"c:/tempuploads/newFile.txt"))  //判断文件是否存在

{

CopyFile();            //复制文件

DeleteFile();          //删除文件

MoveFile();            //移动文件

}

else

{

MakeFile();             //生成文件

OpenFile();             //打开文件

SetFile();              //设置文件属性

}

此外,File类对于Text文本提供了更多的支持

AppendText:将文本追加到现有文件

CreateText:为写入文本创建或打开新文件

OpenText:打开现有文本文件以进行读取

但上述方法主要对UTF-8的编码文本进行操作,不够灵活。

推荐以下面的代码操作

txt文件读:

StreamReader TxtReader = new StreamReader(@"c:/tempuploads/newFile.txt",System.Text.Encoding.Default);

string  FileContent;

FileContent = TxtReader.ReadEnd();

TxtReader.Close();

txt文件写:

StreamWriter = new StreamWrite(@"c:/tempuploads/newFile.txt",System.Text.Encoding.Default);

string FileContent;

TxtWriter.Write(FileContent);

TxtWriter.Close();

System.IO.Directory类和System.DirectoryInfo类
主要提供关于目录的各种操作,使用时需要引用System.IO命名空间。下面通过程序实例来介绍其主要属性和方法。

●     目录创建Directory.CreateDirectory

public static DirectoryInfo CreateDirectory(

   string path

);

下面的代码创建了c:/tempuploads/NewDirectory目录。



private void MakeDirectory()

{

Directory.CreateDirectory(@"c:/tempuploads/NewDirectoty");

}

●     目录设置

下面的代码设置c:/tempuploads/NewDirectory目录为只读,隐藏。

与文件属性相同,目录属性也是使用FileAttributes来进行设置的。

private void SetDirectory()

{

DirectoryInfo NewDirInfo = new DirectoryInfo(@"c:/tempuploads/NewDirectoty");

NewDirInfo.Atttributes = FileAttributes.ReadOnly|FileAttributes.Hidden;

}

●     目录删除Directory.Delete

public static void Delete(

   string path,

   bool recursive

);

下面的代码将c:/tempuploads/BackUp目录删除。

Delete方法的第二个参数决定是否删除非空目录。

为true时,将删除整个目录,即使该目录下有文件或子目录。

为false时,仅当目录为空时才可删除。

private void DeleteDirectory()

{

Directory.Delete(@"c:/tempuploads/BackUp",true);

}

●     目录移动Directory.Move

public static void Move(

   string sourceDirName,

   string destDirName

);

下面的代码将目录c:/tempuploads/NewDirectory移动到

c:/tempuploads/BackUp

private void MoveDirectory()

{

File.Move(@"c:/tempuploads/NewDirectory",@"c:/tempuploads/BackUp");

}

●     获取当前目录下的所有子目录Directory.GetDirectories

public static string[] GetDirectories(

   string path

);

下面的代码读出c:/tempuploads/目录下的所有子目录。将其存储到字符串数组中。

private void GetDirectory()

{

    string [] Directorys;

Directorys = Directory. GetDirectories (@"c:/tempuploads",);

}

●     获取当前目录下的所有文件Directory.GetFiles

public static string[] GetFiles(

   string path

);

下面的代码读出c:/tempuploads/目录下的所有文件。将其存储到字符串数组中。

private void GetFile()

{

    string [] Files;

Files = Directory. GetFiles (@"c:/tempuploads",);

}

●     判断目录是否存在Directory.Exist

public static bool Exists(

   string path

);

该代码判断是否存在c:/tempuploads/NewDirectory目录。

若存在,先获取该目录下的子目录和文件,然后其移动,最后将移动后的目录删除。

若不存在,创建该目录,然后将目录属性设为只读,隐藏。

if(File.Exists(@"c:/tempuploads/NewDirectory"))  //判断文件是否存在

{

GetDirectory();             //获取子目录

GetFile();                  //获取文件

MoveDirectory();            //移动目录

DeleteDirectory();          //删除目录

}

else

{

MakeDirectory();             //生成目录

SetDirectory();              //设置目录属性

}

注意:路径有三种方式,当前目录下的相对路径,当前工作盘的相对路径,绝对路径以 C:/Tmp/Book为例。(假定当前工作目录为C:/Tmp)

“Book”,”/Tmp/Book”,”C:/Tmp/Book”都表示了C:/Tmp/Book

另外,在C#中 “/”是特殊字符要表示它的话需要使用“//”。

由于这种写法不方便,C#语言中提供了@对其简化。只要在字符串前加上@即可直接使用”/”。所以上面的路径在C#中应该表示为

“Book”,@”/Tmp/Book”,@”C:/Tmp/Book”

查看文件夹内容
就像操作本地的计算机一样,需要为每个网络用户提供各自的一块硬盘空间,用户登录后便可以对自己的空间进行管理。管理是多方面的,首先用户应该能看到自己文件夹下的所有内容,另外需要提供多级文件夹目录的支持。

下面要介绍的实例包括了“网上硬盘”的许多功能,我们将一步步为大家进行介绍。首先来创建工程实例,然后进行主界面的设计,最后对各个功能的实现进行分别介绍。

新工程创建
新工程创建的步骤如下:

1.  打开MicroSoft Visual Studio.NET应用程序

2.  选择【文件】|【新建】|【项目】,打开【新建项目】对话框,如图进行以下选择和设置:在项目类型中选择Visual C#项目,随后在右边模板中选择ASP.NET WEB应用程序,然后把对话框下面显示的位置改为
http://localhost/WebDisk,单击【确定】按钮完成新项目创建。


图16.1  新建项目设置

3.   工程创建完后,将直接打开一个创建好的Web页面,名称为“WebForm1.aspx”,选择【视图】|【解决方案资源管理器】,打开【解决方案资源管理器】,这里可以对工程的所有资源进行统一管理,在这里可以看到已经刚才提到的“WebForm1.aspx”。

4.  选择【项目】|【添加新项】,打开【添加新项】对话框,在右边“模板”中选择Web窗体,左下角名称更名为“NetWorkDisk.aspx”,单击【打开】完成新项的添加。


图16.2  添加新项对话框

主界面设计
创建好工程和新项后,就要进行功能主界面的设计了。为了使用户界面更为友好易用,就需要使用很多服务器控件。下面这张图是设计好的功能界面图,我们将通过一系列步骤进行说明:


图16.3  “网络硬盘”主界面设计图

1.  选择【视图】|【工具箱】,打开【工具箱】对话框。

2.  在【服务器资源管理器】中双击“NetWorkDisk.aspx”,在页面左下角选择【设计】。然后就可以对控件进行添加了。

3.  选择【工具箱】|【HTML】,双击该目录下的【Flow Layout Panel】控件,按图1.3所示放置该对象,并在其中添加文字“网络硬盘――您的个人移动秘书”。

4.  选择【工具箱】|【WEB窗体】,双击该目录下的【Label】控件,右键点击生成的控件对象选择【属性】,对其属性进行设置:其中(ID)名称设为“Info”,(Text)属性设为空,(ForeColor)属性设为“Red”。

5.  和步骤四类似,再添加三个Label控件,把其Text属性分别设置为“目录浏览”、“文件上传”和“目录新建”,其它属性项采取默认设置。

6.  选择【工具箱】|【WEB窗体】,双击该目录下的【ListBox】控件,对生成的控件对象属性进行设置:(ID)名称设为“FileList”,再按图1.3的位置放置。

7.  添加两个【Button】类型的【WEB窗体】控件,(ID)分别设置为“BtnOpen”和“BtnDelete”,(Text)属性分别设为“打开”和“删除”。

8.  选择【工具箱】|【HTML】,双击该目录下的【File Field】控件,将其位置定位于“文件上传”之后。

9.  新增一个【TextBox】类型的【WEB窗体】控件,(ID)设置为“NewDirName”,位置位于“新建目录”之后。

10.如图还需增加“上传”和“新增目录”两个Button控件,(ID)分设为“BtnUpLoad”和“BtnNewDir”。

11.新增两个【CheckBox】类型的【WEB窗体】控件,(ID)分别设置为“chkReadOnly”和“chkHidden”,(Text)分别设为“只读”和“隐藏”。

注意:上面完成了控件的添加和页面布置工作,为了使File Field控件对象能够正常工作,还需要在Html代码中进行相关的设置。单击左下角的【HTML】按钮,找到<form id= "WebForm1" method="post" runat="server">,将其修改为<form id= "WebForm1" method="post" runat="server" EncType="multipart/form-data">,因为File Field控件只有在HtmlForm 的 Enctype属性设置为“multipart/form-data”时才起作用。

另外还要为File Field控件增加id标识,在html代码中找到:

<INPUT runat="server" style="Z-INDEX: 107; LEFT: 131px; WIDTH: 490px; POSITION: absolute; TOP: 336px; HEIGHT: 22px" type="file" size="62">

将其修改为:

<INPUT runat="server" style="Z-INDEX: 107; LEFT: 131px; WIDTH: 490px; POSITION: absolute; TOP: 336px; HEIGHT: 22px" type="file" size="62" id="WebFile" name="WebFile">

这样我们就完成了主界面的设计工作,友好的界面风格必须配备相应的代码支持。下面马上就要转入后台程序的编码了。

代码实现
在介绍“网络硬盘”概念时已经提到,每个用户在“网络硬盘”上有自己的一块空间。在下面程序设计中是这样处理的:为用户提供一个固定的文件夹,在这个文件夹下用户可以自己增加/删除新的文件夹或文件。如图1.4所示,首次打开网页时将列出该文件夹下的所有内容(包括文件和文件夹)。如果想进入下一级文件夹,可以选中该文件夹,然后单击【打开】进入。下面将就查看文件夹内容功能的实现进行分步骤说明。


图16.4  用户主界面

●     页面加载

由于我们提供的用户目录是固定的,如“c:/UserDir”,而且要求在页面加载后显示该文件夹所有内容,所以需要在Page_Load中进行相应操作:首先要判断该文件夹是否存在,如果不存在需要先创建它;然后再列出该文件夹下的内容。其代码实现如下:

private void Page_Load(object sender, System.EventArgs e)

{

     // 在此处放置用户代码以初始化页面

     if(Page.IsPostBack==false)

      {

         CurrentPath= @"c:/UserDir/";  //设置当前目录

       if(Directory.Exists(@"c:/UserDir/")==false) //若该目录不存在,创建该目录

             Directory.CreateDirectory(@"c:/UserDir/");

   LoadDir(CurrentPath);  //初始化装入目录

      }

}

LoadDir(string FullPath)方法用以列出该文件夹下的所有内容,代码如下:

private void LoadDir(string FullPath)

          {

                    CurrentPath=FullPath;

                    ArrayList values = new ArrayList();

                    string [] MyFiles,MyDirs;

                    MyFiles = Directory.GetFiles(FullPath);  //得到该目录下所有文件

                    if(CurrentPath!=@"c:/UserDir")  //若不是顶级目录,增加返回上级目录选项

                    {

                             values.Add("返回上级目录");

                    }

                    values.AddRange(MyFiles);  //加入文件

                    MyDirs= Directory.GetDirectories(FullPath);  //得到该目录下所有目录

                    values.AddRange(MyDirs);  //加入目录

                    FileList.DataSource=values;  //设定数据源

                    FileList.DataBind();  //绑定数据

          }

首先要定义一个ArrayList数组对象values,它用来存放顶级目录下的所有内容(保括文件夹名和文件名)。Directory.GetFiles ()方法返回顶级目录下的所有文件名,其返回类型为一个string数组,故需要定义一个string类对象MyFiles来保存返回的文件名; Directory.GetDirectories()返回顶级目录下的所有文件夹名称,同样定义一个string数组对象MyDirs来保存它们。完成这些后就可以把MyFiles和MyDirs数组添加进values对象了。最后要做的只是为ListBox控件对象FileList添加数据源和绑定数据了。有一点需要说明:如果当前目录不是顶级目录,则需要能返回到上级目录,为此需要在FileList中添加“返回上级目录”选项。

●     多级目录查看

通过这两段代码,就可以完成在页面加载时列出顶级目录下的所有内容。当然列出顶级目录下的内容还是不够的,和Windows操作系统类似,网络硬盘中文件夹目录也是嵌套的,存在二级或者多级文件夹目录。为此要进行一些相应的处理,使得用户可以查看多级文件夹目录内容。前面界面设计中提供了一个“打开”按钮,用户选择相应的文件夹后,单击该按钮就可以查看到该文件夹下的内容。

下面就为“打开”按钮添加代码,在【设计】中双击该按钮,系统就会自动为其添加事件,代码内容如下:

private void btnOpen_Click(object sender, System.EventArgs e)

          {

                    if(FileList.SelectedItem.Text=="返回上级目录")   //返回上级目录

                    {

                             string ParentPath=Directory.GetParent(CurrentPath).ToString();

                             LoadDir(ParentPath);

                             return;

                    }

                    else    //打开目录

                   {

                             LoadDir(FileList.SelectedItem.Text);

                    }

          }

程序首先判断用户选中的是不是“返回上级目录”,如果是的话,则要先通过Directory.GetParent()方法返回上级文件夹名称,然后再调用 LoadDir()方法来显示该目录下的内容;如果用户选中的不是“返回上级目录”而是一个文件夹名称,则可以直接调用LoadDir()方法, FileList.SelectedItem.Text为选中的文件夹名,用它来做为LoadDir()方法的参数。

创建新文件夹同时可设置访问权限
创建新文件夹是“网络硬盘”用户管理的一项重要内容,在创建文件夹的同时,还希望能够对文件夹的属性进行相关的设置,如“只读”或者“隐藏”等等。

界面布置
和这部分功能相关的控件包括以下几个:(ID)为“NewDirName”的TextBox控件,用户在这里输入新文件夹名;(ID)分别为 “chkReadOnly”和“chkHidden”的两个CheckBox控件,用来设置新文件夹的属性;(ID)为“btnNewDir”的 Button控件,单击它生成新文件夹。

代码实现
在【设计】中双击“btnNewDir”按钮,为其添加事件处理,代码如下所示:

private void btnNewDir_Click(object sender, System.EventArgs e)

          {

if(NewDirName.Text=="")

                    {

                             Info.Text="请先输入要创建的新文件夹名";

                             return;

                    }

                    string FullDirName = CurrentPath + @"/" + NewDirName.Text;   //生成完整路径

                    try

                    {

                             if(Directory.Exists(FullDirName))

                             {

                                      Info.Text="已存在该文件夹,请更换名称";

                                      return;

                             }

                             DirectoryInfo DirInfo = Directory.CreateDirectory(FullDirName);  //创建目录

                             if (chkReadOnly.Checked==true)

                             {      

                                      if(chkHidden.Checked==false)

                                                DirInfo.Attributes = FileAttributes.ReadOnly;

                                      else

                                                DirInfo.Attributes = FileAttributes.ReadOnly|FileAttributes.Hidden;

                             }

                             else

                             {

                                      if(chkHidden.Checked==true)

                                                DirInfo.Attributes = FileAttributes.Hidden;

                             }

                             LoadDir(CurrentPath);  //重新载入当前目录

                    }

                    catch

                    {

                             Info.Text="创建文件夹失败,请与管理员联系";

                    }

          }

首先要判断的就是用户是否输入了新文件夹名称,如果没有输入的话,则输出错误提示信息“请先输入新文件夹名”,然后退出程序。

如果用户已输入新的文件夹名称,则要判断是否已存在同名文件夹,为此要先得到完整的文件夹路径名“FullDirName”,然后利用 Directory.Exists()方法进行判断。若该文件夹还没被创建,则就可以用Directory.CreateDirectory()方法来创建该文件夹。

随后就要对文件夹属性进行设置了,在这里利用了DirectoryInfo类的Attributes属性,文件夹属性包括存档、压缩、目录、隐藏、脱机、只读、系统等等,在这里我们只对只读和隐藏属性进行设置,其它属性设置与之类似。

最后要调用LoadDir()方法重新列出当前目录下的内容,如果文件夹创建成功的话,可以看到新创建的文件夹名。

上传文件到指定文件夹
用户最终是要和文件打交道的,文件夹仅仅是用来方便管理的。文件的上传和下载也就成为“网络硬盘”功能设计中的重要一环。

界面布置
这部分功能涉及到的控件主要有两个:一个是(ID)为“WebFile”的File Field控件,它用来浏览上传文件路径;另一个是(ID)为“btnUpLoad”的上传按钮,单击它完成文件上传。

代码实现
在【设计】中双击“btnUpLoad”按钮,为其添加事件处理,代码如下所示:

private void BtnUpload_Click(object sender, System.EventArgs e)

          {

                    if(WebFile.PostedFile.FileName=="")

                    {

                             Info.Text="请先选择要上传的文件";

                             return;

                    }

                    try

                    {

                             char[] spliter = {'//'};

                             string [] FileName = WebFile.PostedFile.FileName.Split(spliter,10);

                             string FullPath = CurrentPath + @"/" + FileName[FileName.Length-1];  

//生成完整文件名

                             WebFile.PostedFile.SaveAs(FullPath);  //保存文件

                             LoadDir(CurrentPath);  //重新载入当前目录

                    }

                    catch

                    {

                             Info.Text="上传文件失败,请与管理员联系";

                    }

          }

首先要判断用户是否选择了要上传的文件,这可以通过WebFile.PostedFile.FileName属性来得到,需要说明的是:WebFile是一个“File Field”控件对象,该控件属于HtmlInputFile类,HtmlInputFile.PostedFile方法用来获取对客户端上载文件的访问。

在确定用户选择了要上传的文件后,就要对其上传的路径进行设置了。首先要得到该文件的文件名,由于用户提供的是一个客户端完整路径,需要用Split()方法按“//”分隔符进行分割,结果保存在一个数组里。如:“C://UserDir//Chapter1//Ch1.doc”可以被分割为四部分,其最后一部分(数组最后一项)正是我们需要的文件名称。在上面的程序中,FileName[FileName.Length-1]即为用户上传的文件名。

得到上传路径后就可以进行上传了,这里用到了PostedFile.SaveAs()方法。完成上传后,调用LoadDir()方法就可以显示出刚才上传的文件名。

下载文件到本机或在线查看文件内容
上传和下载是一般来说是一个问题的两个方面,上一节我们提到了文件上传,这一节就要对文件下载进行说明。

界面布置
在目录浏览中,如果选择的是一个文件,点击“打开”按钮就可以进行文件下载了,当然也可以选择直接打开,如下图所示:


图16.5下载和在线打开界面

选择“打开”将直接打开该文件,选择“保存”可以下载该文件。

代码实现
打开文件所点击的还是“打开”按钮,所以要在“打开”事件中加以判断,看选中的是文件夹还是文件。故对btnOpen_Click()事件进行了修改,下面加重部分为新增的代码:

private void BtnOpen_Click(object sender, System.EventArgs e)

          {

                    if(FileList.SelectedItem.Text=="返回上级目录")   //返回上级目录

                    {

                             string ParentPath=Directory.GetParent(CurrentPath).ToString();

                             LoadDir(ParentPath);

                             return;

                    }

                    else if(FileList.SelectedItem.Text.IndexOf(".")>0) //打开文件

                    {

                             FileDownload(FileList.SelectedItem.Text);

                    }

                    else    //打开目录

                    {

                             LoadDir(FileList.SelectedItem.Text);

                    }

          }





如果选择的是文件,则调用FileDownload()方法,其代码部分如下:

private void FileDownload(string FullFileName)

{

FileInfo DownloadFile = new FileInfo(YourFileName); //设置要下载的文件

Response.Clear();                            //清除缓冲区流中的所有内容输出

Response.ClearHeaders();                     //清除缓冲区流中的所有头

Response.Buffer = false;                     //设置缓冲输出为false

//设置输出流的 HTTP MIME 类型为application/octet-stream

Response.ContentType = "application/octet-stream";

//将 HTTP 头添加到输出流

Response.AppendHeader("Content-Disposition",

"attachment;filename=" +

HttpUtility.UrlEncode(DownloadFile.FullName,

System.Text.Encoding.UTF8));

Response.AppendHeader("Content-Length", DownloadFile.Length.ToString());

//将指定的文件直接写入 HTTP 内容输出流。

Response.WriteFile(DownloadFile.FullName);

Response.Flush();       //向客户端发送当前所有缓冲的输出

Response.End();         //将当前所有缓冲的输出发送到客户端

}

这段代码是采用输出流的形式进行文件传输,理解起来比较复杂,如果换一种方式进行处理的话,可以在页面加一个HyperLink控件,选择相应的文件时,使得其链接到相应的路径即可。这里不再多说。

删除文件或文件夹
对于不再需要的文件/文件夹用户有权限做删除处理,这一节我们就来介绍如何实现这一功能。

界面布置
主界面设计中有个“删除“按钮,其(ID)为“btnDelete”,用户在目录浏览中选中要删除的项后,单击该按钮就可以完成删除工作。

代码实现
在【设计】中双击“删除”按钮,为其添加事件处理程序如下:

private void BtnDelete_Click(object sender, System.EventArgs e)

          {

                    DeleteThings(FileList.SelectedItem.Text);

          }

private void DeleteThings(string FullPath)

          {

                    if(FullPath.IndexOf(".")>0) //删除文件

                    {

                             File.Delete(FullPath);

                             LoadDir(CurrentPath);  //重新载入当前目录

                    }

                    else    //删除目录

                    {

                             Directory.Delete(FullPath);

                             LoadDir(CurrentPath); //重新载入当前目录

                    }

          }

删除时首先判断选中的是文件还是文件夹,如果是文件,则调用File.Delete()方法;反则调用Directory.Delete()方法。删除成功后再调用LoadDir()方法显示更改后的目录内容。

小结
这一章中我们先对“网络硬盘”概念进行了介绍,然后对.NET中的File类和Directory类进行了说明,为后面实现“网络硬盘”功能做好了知识储备。随后的各节详细的介绍了如何实现在“网络硬盘”中查看文件夹内容、创建新文件夹、上传下载文件以及删除文件和文件夹。

通过本章的学习,读者对于.NET中文件处理应该说有了很深的认识,相信可以达到举一反三的效果。

转自:http://www.cnblogs.com/yinhu/archive/2007/08/13/853461.html
posted @ 2007-11-09 14:53 ◢山前◣ 阅读(58) | 评论 (0)编辑
  2007年10月9日
软件需求

软件需求



    软件需求是(1)用户解决问题或达到目标所需的条件或权能(Capability)。
            (2)系统或系统部件要满足合同、标准、规范或其它正式规定文档所需具有的条件或权能。
           (3)一种反映上面(1)或(2)所描述的条件或权能的文档说明。
                (IEEE
软件工程标准词汇表(1997年)中定义)

一、软件需求的发展

      需求工程是随着计算机的发展而发展的,在计算机发展的初期,软件规模不大,软件开发所关注的是代码编写,需求分析很少受到重视。后来软件开发引入了生命周期的概念,需求分析成为其第一阶段。随着软件系统规模的扩大,需求分析与定义在整个软件开发与维护过程中越来越重要,直接关系到软件的成功与否。人们逐渐认识到需求分析活动不再仅限于软件开发的最初阶段,它贯穿于系统开发的整个生命周期。80年代中期,形成了软件工程的子领域——需求工程(requirement engineering, RE)。进入90年代以来,需求工程成为研究的热点之一。从1993年起每两年举办一次需求工程国际研讨会(ISRE),自1994年起每两年举办一次需求工程国际会议(ICRE),在1996年Springer-Verlag发行了一新的刊物——《Requirements Engineering》。一些关于需求工程的工作小组也相继成立,如欧洲的RENOIR(Requirements Engineering Network of International Cooperating Research Groups ),并开始开展工作。

二、软件需求的层次

  下面这些定义是需求工程领域中常见术语的定义说明。

  软件需求包括三个不同的层次—业务需求、用户需求和功能需求—也包括非功能需求。业务需求( business requirement)反映了组织机构或客户对系统、产品高层次的目标要求,它们在项目视图与范围文档中予以说明。用户需求(user requirement) 文档描述了用户使用产品必须要完成的任务,这在使用实例(use case) 文档或方案脚本(scenario)说明中予以说明。功能需求(functional requirement)定义了开发人员必须实现的软件功能,使得用户能完成他们的任务,从而满足了业务需求。所谓特性(feature)是指逻辑上相关的功能需求的集合,给用户提供处理能力并满足业务需求。软件需求各组成部分之间的关系如图所示。

  作为补充,软件需求规格说明还应包括非功能需求,它描述了系统展现给用户的行为和执行的操作等。它包括产品必须遵从的标准、规范和合约;外部界面的具体细节;性能要求;设计或实现的约束条件及质量属性。所谓约束是指对开发人员在软件产品设计和构造上的限制。质量属性是通过多种角度对产品的特点进行描述,从而反映产品功能。多角度描述产品对用户和开发人员都极为重要。值得注意的一点是,需求并未包括设计细节、实现细节、项目计划信息或测试信息。需求与这些没有关系,它关注的是充分说明你究竟想开发什么。

  Frederick Brooks在他1987年的经典的文章“No Silver Bullet:Essence and Accidents ofSoftware Engineering ”中充分说明了需求过程在软件项目中扮演的重要角色:

  开发软件系统最为困难的部分就是准确说明开发什么。最为困难的概念性工作便是编写出详细技术需求,这包括所有面向用户、面向机器和其它软件系统的接口。同时这也是一旦做错,将最终会给系统带来极大损害的部分,并且以后再对它进行修改也极为困难。

  为什么这么说呢,因为在大多数的软件系统中,最终用户可能都不清楚他的需求是什么,这是千真万确的。如果你的用户告诉你需求就是这些了,不要相信他,继续刨根问底,直到你们都筋疲力尽了。

  虽然听上去有些不可思议,但这是教训之谈,在我从事的项目之中,没有一个用户在软件接近完成的时候打电话对我说,我看了你们的软件,我想我必须改动一些地方。在那些日子中,我甚至得了一种电话铃音恐惧症。

三、需求风险

  下面列出了在做需求分析时一些很危险的做法,如果你发现你的一些做法与之相似,那么,给自己一些时间,好好思考一下,这些做法会对你的软件产生致命的影响。

  1. 无足够用户参与

  客户经常不明白为什么收集需求和确保需求质量需花费那么多功夫,开发人员可能也不重视用户的参与。究其原因:一是因为与用户合作不如编写代码有意思;二是因为开发人员觉得已经明白用户的需求了。在某些情况下,与实际使用产品的用户直接接触很困难,而客户也不太明白自己的真正需求。但还是应让具有代表性的用户在项目早期直接参与到开发队伍中,并一同经历整个开发过程。最重要的就是用户必须要重视他的软件,必须让他明白:如果失败,他的损失最大(当然你的损失也不小,但这时候你必须让他重视这项工作)。如果用户不够重视,想办法解决,否则你就不用再继续了。

  2. 用户需求的不断增加

  在开发中若不断地补充需求,项目就越变越庞大以致超过其计划及预算范围。这使得问题更难解决。实际上,问题根源在于用户需求的改变和开发者对新需求所作的修改。要想把需求变更范围控制到最小,必须一开始就对项目视图、范围、目标、约束限制和成功标准给予明确说明,并将此说明作为评价需求变更和新特性的参照框架。说明中包括了对每种变更进行变更影响因素分析的变更控制过程,有助于所有风险承担者明白业务决策的合理性,即为何进行某些变更,相应消耗的时间、资源或特性上的折中。

  产品开发中不断延续的变更会使其整体结构日渐紊乱,补丁代码也使得整个程序难以理解和维护。插入补丁代码使模块违背强内聚、松耦合的设计原则,特别是如果项目配置管理工作不完善的话,收回变更和删除特性会带来问题。如果你尽早地区别这些可能带来变更的特性,你就能开发一个更为健壮的结构,并能更好地适应它。这样设计阶段需求变更不会直接导致补丁代码,同时也有利于减少因变更导致质量的下降。

  最糟糕的莫过于用户觉得如果不再加点什么功能就对不起自己。我曾经看过一个数据仓库的一期工程,在设计阶段没有很好的定义范围,当我向项目管理者提出这个问题的时候,他认为都已经说好了,合同上也写清楚了,并没有加以重视。可是最后,用户提出的修改意见已经远远超出了范围,项目时间也延长了一倍。整个的项目组成员疲惫不堪,可是却不断的接到用户投诉说项目失败。

  3. 模棱两可的需求

  模棱两可是需求规格说明中最为可怕的问题(Lawrence 1996)。它的一层含义是指诸多读者对需求说明产生了不同的理解;另一层含义是指单个读者能用不止一个方式来解释某个需求说明。

  模棱两可的需求会使不同的风险承担者产生不同的期望,它会使开发人员为错误问题而浪费时间,并且使测试者与开发者所期望的不一致。一位系统测试人员曾告诉我,她所在的测试组经常对需求理解有误,以致不得不重写许多测试用例并重做许多测试。

  模棱两可的需求带来不可避免的后果便是返工—重做一些你认为已做好的事情。返工会耗费开发总费用的 40%,而70%~85%的重做是由于需求方面的错误所导致的(leffingwell 1997)。想像一下如果你能减少一半的返工会是怎样的情况?你能更快地开发出产品,在同样的时间内开发更多、更好的产品,甚至能偶尔回家休息休息。

  处理模棱两可需求的一种方法是组织好负责从不同角度审查需求的队伍。仅仅简单浏览一下需求文档是不能解决模棱两可问题的。如果不同的评审者从不同的角度对需求说明给予解释,但每个评审人员都真正了解需求文档,这样二义性就不会直到项目后期才被发现,那时再发现的话会使得更正代价很大。

  4. 不必要的特性

  “画蛇添足”是指开发人员力图增加一些“用户欣赏”但需求规格说明中并未涉及的新功能。经常发生的情况是用户并不认为这些功能性很有用,以致在其上耗费的努力“白搭”了。

  开发人员应当为客户构思方案并为他们提供一些具有创新意识的思路,具体提供哪些功能要在客户所需与开发人员在允许时限内的技术可行性之间求得平衡,开发人员应努力使功能简单易用,而不要未经客户同意,擅自脱离客户要求,自作主张。

  同样,客户有时也可能要求一些看上去很“酷”,但缺乏实用价值的功能,而实现这些功能只能徒耗时间和成本。为了将“画蛇添足”的危害尽量减小,应确信:你明白为什么要包括这些功能,以及这些功能的“来龙去脉”,这样使得需求分析过程始终是注重那些能使用户完成他们业务任务的核心功能。

  时刻记住:软件成功的标准是是否解决用户的问题,而不是它有多Cool的功能。

  5. 过于精简的规格说明

  有时,客户并不明白需求分析有如此重要,于是只作一份简略之至的规格说明,仅涉及了产品概念上的内容,然后让开发人员在项目进展中去完善,结果很可能出现的是开发人员先建立产品的结构之后再完成需求说明。这种方法可能适合于尖端研究性的产品或需求本身就十分灵活的情况(McConnell 1996),不过商业应用大多都不是这种情况。在大多数情况下,这会给开发人员带来挫折(使他们在不正确的假设前提和极其有限的指导下工作),也会给客户带来烦恼(他们无法得到他们所设想的产品)。

  6. 忽略了用户分

  大多数产品是由不同的人使用其不同的特性,使用频繁程度也有所差异,使用者受教育程度和经验水平也不尽相同。如果你不能在项目早期就针对所有这些主要用户进行分类的话,必然导致有的用户对产品感到失望。例如,菜单驱动操作对高级用户太低效了,但含义不清的命令和快捷键又会使不熟练的用户感到困难。

  7. 不准确的计划

  “上述是我对新产品的看法,好,现在你能告诉我你什么时候能完成吗?”许多开发人员都遇到这种难题。对需求分析缺乏理解会导致过分乐观的估计,而当不可避免的超支发生时,会带来颇多麻烦。据报道,导致需求过程中软件成本估计极不准确的原因主要有以下五点:频繁的需求变更、遗漏的需求、与用户交流不够、质量低下的需求规格说明和不完善的需求分析(Davis 1995)。

  对不准确的要求所提问题的正确响应是“等我真正明白你的需求时,我就会来告诉你”。基于不充分信息和未经深思的对需求不成熟的估计很容易为一些因素左右。要作出估计时,最好还是给出一个范围(如最好的情况下,很可能的,最坏情况下)或一个可信赖的程度 (我有9 0 %的把握,我能在8周内完成)。未经准备的估计通常是作为一种猜测给出的,听者却认为是一种承诺。因此我们要尽力给出可达到的目标并坚持完成它。

四、什么是优秀的需求

  讨论软件需求的文章有很多,对于需求的标准也不尽相同,这里我想用NASA的软件开发过程中的概念,软件需求过程的标准是:清楚(Clear)、完整(Complete)、一致(Consistent)、可测试(Testable),此外还有其他的概念,如可跟踪的、可修改的等等。

  清楚:目前大多数的需求分析采用的仍然是自然语言(因为如果采用形式化语言的话,和用户的沟通将成为一个大问题,这意味着客户在开发软件之前必须先进行形式化语言培训,这是不现实的)。自然语言对需求分析最大的弊病就是它的二义性。所以我们不得不对需求分析中采用的语言做某些限制。例如尽量采用主语+动作的简单表达方式。说白了,需求分析中的描述让人看上去像是刚学习写作的小孩子就对了,千万不要采用疑问句、修饰这些华丽的表达方式。

  除了语言的二义性之外,主意不要使用行话,就是计算机术语。需求分析最重要的是和用户沟通,可是用户多半不是计算机的专业人士,如果在需求分析中使用了行话,就会造成用户理解上的困难。

  打个比方,如果你要做一个银行的信用卡系统,你就可以这样描述软件需求:银行的卡部管理信用卡,每张信用卡只属于一个帐户。信用卡有卡号、余额。一张信用卡有多笔的交易记录。

  完整:再也没有什么比软件开发接近完成是发现遗漏了一项需求更糟的事情了。需求的完整性是非常非常重要的,想象一下遗漏需求而不得不返工,这简直就是恶梦。可是令人遗憾的是,需求的遗漏是很经常发生的事情,不仅仅是你的问题,更多的问题发生在用户那里,他们不知道该做些什么。要做到需求的完整性是很艰难的一件事情,它涉及到需求分析过程的各方各面,贯穿了整个过程,从最初的计划制定到最后的需求评审。至于完整性的详细讨论,我们会在下面的章节中讨论,现在你只需要拼命的想象缺乏完整性的坏处,直到你出了一身的冷汗。出了吗?好,那我们继续。

  一致:一致性也是一个比较大的概念,很难用几句话讲清楚。还记得我们在开始的时候提到的需求的层次吗?简单的来说,就是用户需求必须和业务需求一致,功能需求必须和用户需求一致。严格的遵守不同层次间的一致性关系,就可以保证最后开发出来的软件系统不会偏离最初的实现目标。在实现过程中,我们还必须把一致性关系细化。比如说用户需求不能超出先前指定的范围。

  可测试:大家觉得一个项目的测试从什么时候开始呢?有人说从编码完成后开始。更清楚一点的说是编码的时候同时进行单元测试,编码完成后进行系统测试。这些都没有错。但是实际上测试是从需求分析过程就开始了。需求分析是测试计划的输入和参照。这就要求需求分析是可测试的。什么是可测试呢?“我们要用新的系统完成报表自动化处理”,你觉得这个需求是可测试的吗?当然不是,报表包括哪些?自动化处理的标准是什么?这些在需求中都没有说明。因此这项需求是无法测试的,就是不具有可测试性。说到这里,大家可能就会明白之前的需求的几项标准都是为了保证需求的可测试性的。事实就是这样,只有系统的所有需求是可以被测试的,才能够保证软件始终围绕着用户的需要,保证软件系统是成功的。

五、软件需求过程

      软件需求工程主要包括两个方面:需求开发和需求管理

      需求开发可进一步分为:需求获取、需求分析、编写需求规格和需求验证四个阶段。各阶段说明如下:

      需求获取阶段:
      这一阶段的核心任务就是确定三个层次的需求,对于业务层要强调明确业务总目标及使用范围,对于用户层,要强调明晰用户
工作流程,对于功能层还要收集系统运行环境的限制等非功能性需求。不同的时间、不同的用户会由于不同的业务目标及使用范围而提出不尽相同的需求,同时由于没有约定提出方式也会有各不相同的表现形式。针对上述问题,首先要确定用户代表并对其在需求中的主次地位于以划分;其次要确定需求的整个开发过程,最后还要明确不同层次的需求要以约定的形式出具文档,以备双方的交流及问题检查。

      需求分析阶段:
      这一阶段的核心任务就是确定并完善需求。初期阶段所获得的大量需求往往是不系统、不完整甚至个别需求是错误的、不必要的,只有通过提炼、分析和仔细审查需求,彼此沟通,采用适当的表现形式,比如绘制业务目标关联图、绘制功能结构示意图、编制数据字典、编写用户实例等,明白需求含义并找出其中的错误、遗漏或不足的地方,尤其是应采用特定符号标识需求优先级。

      编写需求规格阶段:
      这一阶段的任务强调将已收集并做分析处理的需求经编制整理形成规范化的可视文档,即软件需求规格说明书。

      需求验证阶段。
      本阶段是需求开发工作的最后阶段,要确定在第三阶段所编制的需求文档是否与预期结果一致,是否符合高质量需求的评价标准。这项工作可以通过评审来完成。评审可以根据用户代表的个人偏好、习惯予以审查需求,也可以遵循行业质量控制办法制定严格的步骤进行审查,这主要取决于项目的大小、需求及各个部分的重要程度。

      需求管理需要"建立并维护在软件工程中同客户达成的契约"。这种契约都包含在编写的需求规格说明与模型中。客户的接受仅是需求成功的一半,开发人员也必须能够接受他们,并真正把需求应用到产品中。

      通常的需求管理活动包括:
          定义需求
基线(迅速制定需求文档的主体)。
          评审提出的需求变更、评估每项变更的可能影响从而决定是否实施它。
          以一种可控制的方式将需求变更融入到项目中。
          使当前的项目计划与需求一致。
          估计变更需求所产生影响并在此基础上协商新的承诺(约定)。
          让每项需求都能与其对应的设计、源代码和测试
用例联系起来以实现跟踪。
          在整个项目过程中跟踪需求状态从其变更情况。

六、软件需求方法

      软件需求分析方法大体分为如下四类:结构化方法面向对象方法、面向控制方法和面向数据方法。限于篇幅,本文将主要从结构化方法和面向对象方法以及RUP三个方面进行简要的探讨。

1、结构化分析方法

      结构化分折(Structured Analysis, SA) 方法是一种单纯的由顶向下逐步求精的功能分解方法。分析员首先用上下文图表(称为数据流图DFD)表示系统的所有输入/输出,然后反复地对系统求精,每次求精都表示成一更详细的DFD从而建立关于系统的一个DFD层次。为保存DFD中的这些信息,使用数据字典来存取相关的定义、结构及目的。SA方法是目前实际应用效力广泛的需求工程技术。它具有较好的分别、抽象能力,为开发小组找到了一种中间语言,易于软件人员所掌握。但它离应用领域尚有一定的距离,难以直接应用领域术民与软件设计也有一段不小的距离因而为开发小组的思想交流带来了一定的困难。

2、面向对象分析方法

      面向对象Object Oriented, OO)的方法把分析建立在系统对象以及对象间交互的基础之上,使得我们能以3个最基本的方法框架——对象及其属性、分类结构和集合结构来定义和沟通需求。面向对象的问题分析模型从3个侧面进行描述,即对象模型(对象的静态结构)、动态模型(对象相互作用的顺序)和功能模型(数据变换及功能依存关系)。需求工程的抽象原则、层次原则和分割原则同样适用于面向对象方法,即对象抽象与功能抽象原则是一样的,也是从高级到低级、从逻辑到物理,逐级细分.每一级抽象都重复对象建模(对象识别)一动态建模(事件识别)一功能建模(操作识别)的过程,直到每一个对象实例在物理(程序编码)上全部实现为止。

      面向对象需求分析(OORA)利用一些基本概念来建立相应模型,以表达目标系统的不同侧面。尽管不同的方法所采用的具体模型不尽相同,但都无外乎用如下五个基本模型来描述软件需求:

      整体—部分模型:该模型描述对象(类)是如何由简单的对象(类)构成的。将一个复杂对象(类)描述成一个由交互作用的若干对象(类)构成的结构的能力是OO途径的突出优点。该模型亦称聚合模型。

      分类模型:分类模型描述类之间的继承关系。与聚合关系不同,它说明的是一个类可以继承另一个或另一些类的成分,以实现类中成分的复用。

      类—对象模型:分析过程必须描述属于每个类的对象所具有的行为,这种行为描述的详细程度可以根据具体情况而定。既可以只说明行为的输入、输出和功能,也可以采用比较形式的途径来精确地描述其输入、输出及其相应的类型甚至使用伪码或小说明的形式来详细刻画。

      对象交互模型:一个面向对象的系统模型必须描述其中对象的交互方法。如前所述,对象交互是通过消息传递来实现的。事实人对象交互也可看作是对象行为之间的引用关系。因此,对象交互模型就要刻画对象之间的消息流。对应于不同的详细程度,有不同的消息流描述分析,分析人员应根据具体馆况而选择。一般地,一个详细的对象交互模型能够说明对象之间的消息及其流向,并且同时说明该消息将激活的对象及行为。一个不太详细的对象交互模型可以只说明对象之间有消息,并指明其流向即可。还有一种状况就是介于此两者之间。

       状态模型:在状态模型中,把一个对象看作是一个有限状态机,由一个状态到另一状态的转变称作状态转换。状态模型将对象的行为描述成其不同状态之间的通路。它也可以刻画动态系统中对象的创建和废除,并称由对象的创建到对象的废除状态之间的退路为对象的生存期。

       状态模型既可以用状态转换因的图形化手段,又可用决策表或称决策矩阵的形式来表。

3、基于RUP的软件需求

      RUP(Rational Unified Process)是Rational公司开发和维护的过程产品。RUP是工程化的软件开发过程,它提供了在开发机构中分派任务和责任的纪律化方法。RUP 不仅仅是一个简单的过程,而是一个通用的过程框架,可用于各种不同类型的软件系统、各种不同的应用领域、各种不同类型的组织、各种不同的功能级别以及各种不同的项目规模。RUP的突出特点可以由以下三个关键词来体现——用例驱动、以构架为中心、迭代和增量的。这些是RUP所特有的,也是同等重要的。构架提供了一种结构来指导迭代过程中的工作,而用例则确定了目标井驱动每次迭代的工作。

      进行需求分析的基础是要获得用户的需要,为了完成这一工作,必须建立业务模型,通过描述业务规则、业务逻辑,明确业务过程并对其进行规范、优化。对于一个系统,在建立业务模型时,应从3个方面来描述其特性:功能、行为、数据,对应于这些特性。

4、软件需求方法的比较分析

      基于上述分析可知,结构化分析方法与面向对象分析方法的区别主要体现在两个方面:

      * 将系统分解成于系统的方式不同。前者将系统描述成一组交互作用的处理,后者则描述成一组交互作用的对象。
      *
子系统之间的交互关系的描述方式不一样。前者加工之间的交互是通过不太精确的数据流来表示的,而后者对象之间通过消息传递交互关系。

      因此,面向对象软件需求分析的结果能更好地刻画现实世界,处理复杂问题,对象比过程更具有稳定性,便于维护与复用。
(出处:
UML软件工程,博客中国)

七、软件需求说明书

  软件需求说明书的编制是为了使用户和软件开发者双方对该软件的初始规定有一个共同的理解, 使之成为整个开发工作的基础。编制软件需求说明书的内容要求如下:

  1 引言

  1.1编写目的

  说明编写这份软件需求说明书的目的,指出预期的读者。

  1.2背景

  说明:

  a.待开发的软件系统的名称;
b.本项目的任务提出者、开发者、用户及实现该软件的计算中心或计算机网络;
C.该软件系统同其他系统或其他机构的基本的相互来往关系。

  1.3定义

  列出本文件中用到的专门术语的定义和外文首字母组词的原词组。

  1.4参考资料

  列出用得着的参考资料,如:
a.本项目的经核准的计划任务书或合同、上级机关的批文;
b.属于本项目的其他已发表的文件;
c.本文件中各处引用的文件、资料、包括所要用到的软件开发标准。 列出这些文件资料的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。

  2 任务概述

  2.1目标

  叙述该项软件开发的意图、应用目标、作用范围以及其他应向读者说明的有关该软件开发的背景材料。解释被开发软件与其他有关软件之间的关系。如果本软件产品是一项独立的软件,而且全部内容自含,则说明这一点。如果所定义的产品是一个更大的系统的一个组成部分,则应说明本产品与该系统中其他各组成部分之间的关系,为此可使用一张方框图来说明该系统的组成和本产品同其他各部分的联系和接口。

  2.2用户的特点

  列出本软件的最终用户的特点,充分说明操作人员、维护人员的教育水平和技术专长,以及本软件的预期使甩频度。这些是软件设计工作的重要约束

  2.3假定和约束

  列出进行本软件开发工作的假定和约束,例如经费限制、开发期限等。

  3 需求规定

  3.1对功能的规定

  用列表的方式(例如IPO表即输入、处理、输出表的形式),逐项定量和定性地叙述对软件所提出的功能要求,说明输入什么量、经怎样的处理、得到什么输出,说明软件应支持的终端数和应支持的并行操作的用户数。

  3.2对性能的规定

  3.2.1精度

  说明对该软件的输入、输出数据精度的要求,可能包括传输过程中的精度。

  3.2.2时间特性要求

  说明对于该软件的时间特性要求,如对:
a.响应时间;
b.更新处理时间;
c.数据的转换和传送时间;
d.解题时间; 等的要求。

  3.2.3灵活性

  说明对该软件的灵活性的要求,即当需求发生某些变化时,该软件对这些变化的适应能力,如:

  a.操作方式上的变化;
b.运行环境的变化;
c.同其他软件的接口的变化;
d.精度和有效时限的变化;
e.计划的变化或改进。
对于为了提供这些灵活性而进行的专门设计的部分应该加以标明。

  3.3输人输出要求

  解释各输入输出数据类型,并逐项说明其媒体、格式、数值范围、精度等。对软件的数据输出及必须标明的控制输出量进行解释并举例,包括对硬拷贝报告(正常结果输出、状态输出及异常输出)以及图形或显示报告的描述。

  3.4数据管理能力要求

  说明需要管理的文卷和记录的个数、表和文卷的大小规模,要按可预见的增长对数据及其分量的存储要求作出估算。

  3.5故障处理要求

  列出可能的软件、硬件故障以及对各项性能而言所产生的后果和对故障处理的要求。

  3.6其他专门要求

  如用户单位对安全保密的要求,对使用方便的要求,对可维护性、可补充性、易读性、可靠性、运行环境可转换性的特殊要求等。

  4 运行环境规定

  4.1设备

  列出运行该软件所需要的硬设备。说明其中的新型设备及其专门功能,包括:
a.处理器型号及内存容量;
b.外存容量、联机或脱机、媒体及其存储格式,设备的型号及数量;
c.输入及输出设备的型号和数量,联机或脱机;
d.数据通信设备的型号和数量;
e.功能键及其他专用硬件

  4.2支持软件

  列出支持软件,包括要用到的操作系统、编译(或汇编)程序、测试支持软件等。

  4.3 接口

  说明该软件同其他软件之间的接口、数据通信协议等。

  4.4控制

  说明控制该软件的运行的方法和控制信号,并说明这些控制信号的来源。

转自:http://www.itisedu.com/phrase/200603061756235.html
posted @ 2007-10-09 20:03 ◢山前◣ 阅读(68) | 评论 (0)编辑
  2007年9月13日
SharePoint v3:忘掉模拟用户Impersonate,SPSecurity.RunWithElevatedPrivileges来了

转自:http://westart.blog.enorth.com.cn/article/217988.shtml

SharePoint v3:忘掉模拟用户Impersonate,SPSecurity.RunWithElevatedPrivileges来了

回顾:

在SharePoint V2 大家应该都用过模拟用户Impersonate这个功能,

这个功能用来暂时提升某个用户的权限,比如某个普通用户的本来不能修改某个列表的值,但是我们功能需要在修改。

缺点:

    我们使用这个模拟用户功能时候,经常是明文保存用户名密码,是个安全隐患。

    更加气愤的是,据我所知,在匿名用户访问状态下面,根本不能够模拟成功。

V3解决办法:

Elevation of Privilege 

Elevation of privilege is a new feature of that enables you to programmatically perform actions in code using an increased level of privilege. The Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges method enables you to supply a delegate that runs a subset of code in the context of an account with higher privileges than the current user.

A standard usage of RunWithElevatedPrivileges is:

SPSecurity.RunWithElevatedPrivileges(delegate()

{

    // do things assuming the permission of the "system account"

});

Frequently, to do anything useful within SharePoint you'll need to get a new SPSite object within this code to effect the changes.  For example:

SPSecurity.RunWithElevatedPrivileges(delegate()

{

    using (SPSite site = new SPSite(web.Site.ID))

    {

       // do things assuming the permission of the "system account"

    }

});

Although elevation of privilege provides a powerful new technique for managing security, it should be used with care. You should not expose direct, uncontrolled mechanisms for people with low privileges to circumvent the permissions granted to them. 

注意:

SPSite要在代码块里面创建,而不能使用当前的SPSite

// Uses the App poll creds with the SPUser's identity reference of user

SPSecurity.RunWithElevatedPrivileges(delegate()

{

// Gets a new security context using

using (SPSite site = new SPSite( SPContext.Current.Site.ID ))

{

using (SPWeb thisWeb = site.OpenWeb())

{

thisWeb.AllowUnsafeUpdates = true;

SPItem item = //web.GetListItem(this.Page.Request.Url.ToString());

thisWeb.GetList(ListName).GetItemById(ID);

item[FieldName] = (item[FieldName] == null) ? 1 : (double)item[FieldName] + 1;

item.Update();

writer.Write("Visited Counter. Current:(" + item[FieldName].ToString() + ")");

}

}

});

    运行那一段代码的用户是应用程序池的用户,(在IIS里面设置,避免了明文保存)

    

    注意要关闭SPSite /SPWeb ,可以参考: http://msdn2.microsoft.com/en-us/library/aa973248.aspx

结束:

经过测试,匿名用户也能成功。我的浏览计数功能就使用了该段代码。

MSDN参考:

Elevation of Privilege : http://msdn2.microsoft.com/en-us/library/aa543467.aspx

Best Practices: Using Disposable Windows SharePoint Services Objects