迈克老猫(MikeCat)
来自:老猫の理想
前面我介绍了system.io空间下的文件操作对象,这里我讲解一下如何制作应用于特定页面的计数器。每个计数器都需要一个相应的文件来存储当前的访问量,那么如何建立用来技术的文件、如何对技术文件进行读写以及如何显示当前访问量是我们需要解决的问题。
首先 获取技术文件
因为是单页面计数器,并不应用于特定页面,所以必须能根据当前页面的不同而获取或者生成不同的技术文件。最好把技术文件和页面起相同的名字起不同的扩展名。
我们把获取计数器文件部分的代码包装成一个函数:
function mike_getfilename() as string
dim mike_path as string
dim mike_position as integer
mike_path=request.servervariables("path_translated")
mike_position=instrrev(mike_path,".")
mike_getfilename=mid(mike_path,1,mike_position) & "count"
end function
使用request对象的servervariables("PATH_TRANSLATED")方法来获取当前页面的绝对路径。
instrRev函数返回某字符串在另一个字符串中出现的从结尾计起的位置
mid函数用于从字符串中返回指定数目的字符 Mid(string, start[, length])
参数
string:字符串表达式,从中返回字符。如果 string 包含 Null,则返回 Null。
Start:string 中被提取的字符部分的开始位置。如果 start 超过了 string 中字符的数目,Mid 将返回零长度字符串 ("")。
Length:要返回的字符数。如果省略或 length 超过文本的字符数(包括 start 处的字符),将返回字符串中从 start 到字符串结束的所有字符
使用mid(mike_path,1,mike_position)将当前页面的文件名和.一起截取下来,然后把我们定义的扩展名连到串上,就得到了我们需要的计数文件名。
然后 读取计数文件
下面我们要进行的操作是对计数文件进行读写操作,首先我们使用先前定义的mike_getfilename()函数得到当前文件名:
dim mike_pathname as string
mike_pathname=mike_getfilename()
实例化一个对该文件的读取通道,即创建一个filestream对象:
mike_stream=new filestream(mike_pathname,filemode.openorcreate,fileaccess.read)
防止出现异常即该页面第一次被访问,计数文件使用openorcreate创建。
下面使用streamreader对象对文件进行读取操作:
mike_readobj=new streamreader(mike_stream)
mike_str=mike_readobj.readline()
mike_readobj.close()
这里我们应用到了前面介绍过的streamreader对象的构造函数生成streamreader对象,然后使用readline()方法来读取文件内容,需要特别注意的是
mike_readobj.close()
这个语句很重要,否则当前计数文件就一直被streamreader对象独占,下面对文件进行写操作时就会失败,所以必须使用close()方法释放被streamreader对象占用的文件和系统资源。
其次 显示当前访问量
当前访问量可以采用response.write()方法来显示,这种方法的缺点是不能调整计数器的显示位置。这里我们利用asp.net中的服务器控件label,在业务逻辑代码区设置该控件的text属性。这样就体现出业务逻辑和页面逻辑代码分离的优势,不过毕竟还是在一个文件中,我个人推荐用代码后置即前台页面放在aspx文件,后台文件保存成一个类文件。
count=cint(mike_str)
count+=1
mikecat.text=count
我们通过streamreader读取出来的计数文件转换为数值,然后计数值加1,再在LABEL控件显示出来。此时的mikecat就是label控件。
最后 写入计数器文件
进行写入操作之前仍需要建立一个写入通道:
mike_stream=new filestream(mike_pathname,filemode.open,fileaccess.write)
由于此时计数文件已经存在因此我们仅用到了filemode.open
我们使用streamwriter对象的构造函数来生成一个streamwriter对象来进行文件写操作:
mike_writerobj=new streamwriter(mike_stream)
mike_writerobj.writeline(count)
mike_writerobj.close()
下面给出全部计数器代码,大家可以了解一下其中细节
<%@ Page Language="VB" Debug="True" Explicit="True"%>
<%@ Import Namespace="System.IO" %>
<html>
<head>
<title> New ASP.NET Document </title>
</head>
<body bgcolor="#FFFFFF" topmargin="0" marginheight="0">
<script runat="server" language="vb">
Sub Page_Load(Source As Object, E As EventArgs)
If Not page.ispostback then
Dim count As integer
Dim mike_stream As filestream
Dim mike_pathname,mike_str As string
Dim mike_readobj As streamreader
Dim mike_writerobj As streamwriter
mike_pathname=mike_getfilename()
mike_stream=New filestream(mike_pathname,filemode.openorcreate,fileaccess.read)
mike_readobj=New streamreader(mike_stream)
mike_str=mike_readobj.readline()
mike_readobj.close()
count=cint(mike_str)
count+=1
mikecat.text=count
mike_stream=New filestream(mike_pathname,filemode.open,fileaccess.write)
mike_writerobj=New streamwriter(mike_stream)
mike_writerobj.writeline(count)
mike_writerobj.close()
End if
End Sub
Function mike_getfilename() As string
Dim mike_path As string
Dim mike_position As integer
mike_path=request.servervariables("PATH_TRANSLATED")
mike_position=instrrev(mike_path,".")
mike_getfilename=mid(mike_path,1,mike_position) & "count"
End function
</script>
<form runat="server" method="">
<asp:Label id="mikecat" runat="server"/>
</form>
</body>
</html>
我们这里稍加修改即成为漂亮的图形计数器,两种计数器在文件读写方面完全一致。
在ASP.NET中用于装载图片的控件是image控件,因此下面就采用动态生成image控件的方法来实现动态生成图形。这个容器我们采用<div id="mike_div" runat="server"/>
这里我们需要准备10张图,分别是0~9十个数字的图片(取名0~9.gif),我们采用下面的方法动态生成图像:
dim mike_img as image
dim mike_graph as string
dim i as integer
count=cint(mike_str)+1
for i=1 to len(count)
mike_img=new image()
mike_graph=mid(count,i,1)
mike_img.imageurl=mike_graph & ".gif"
mike_div.controls.add(mike_img)
next
首先我们根据当前的计数字符串的长度来决定需要生成的图形的长度。 new 指令来动态生成image控件,然后用imageurl属性指定要显示的图片路径。最后使用mike_div的add方法将当前生成的image控件加入到容器的控件集合中。
好了,把这段代码加入上面的计数器代码中就成了图形计数器。呵呵。大家试试吧!~