当前位置: 首页 > 图文教程 > 网络编程 > ASP > 关于网站文件自动备份程序的一点思考

ASP
ASP基础讲座(下)
解决IIS5 HTTP500内部错误
ASP 3.0高级编程(四十六)
ASP 3.0高级编程(四十五)
ASP 3.0高级编程(四十四)
ASP 3.0高级编程(四十三)
ASP 3.0高级编程(四十二)
ASP 3.0高级编程(四十一)
ASP 3.0高级编程(三十九)
ASP 3.0高级编程(三十八)
ASP 3.0高级编程(三十七)
ASP 3.0高级编程(三十六)
ASP 3.0高级编程(三十五)
ASP 3.0高级编程(三十四)
ASP 3.0高级编程(三十三)
ASP 3.0高级编程(三十二)
ASP 3.0高级编程(三十一)
ASP错误代码说明
jscript错误代码及相应解释大全
ASP错误处理

ASP 中的 关于网站文件自动备份程序的一点思考


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 71 ::
收藏到网摘: n/a

摘要:
本文提供了一种使用asp php脚本来实现网站文件备份的思路,可以实现指定文件的按天备份。
个人网站往往在虚拟主机上,对主机的控制权限很小,因此不能使用诸如任务计划来实现定时备份,我们需要换一种思路来实现相似的自动备份。
我们可以利用用户对网站的访问来实现对指定文件的按天备份。
基本思路是:用户访问网站 → 读取最后备份日期、读取当前日期然后比较,如果这两个日期不一致则调用备份程序来实现对指定文件的备份,备份完成后再写入新的日期标记,这时候用户再访问网站,日期已经是最新的了,就会跳过备份程序继而执行其他程序。
分析这个思路:备份程序会在每天的第一个用户访问网站的时候启动,便可以达到按天备份的效果,然而如果这天没有用户访问则不会备份,这个并无多大关系,因为如果没有用户访问网站,则网站内容不会发生很大改变。因此可以忽略这个情况。
需要注意的是,可能存在两个人同时访问网站,而同时启动备份程序的情况,便可能会对备份内容造成覆盖,对此我们可以在程序中添加判断语句,如果文件已经存在则不去覆盖它。
如果是要备份的两个文件的文件名也相同则也会造成覆盖,我们假定文件是全不相同的。
还有一个比较重要的问题是,在备份程序中必须采用的时期格式是 4位数年和2位数月、日,不足位数必须补零。 例如:2006-05-31只有这样才能实现日期大小的比较,在asp中我们可以用一个小程序来实现,在php中已经有这样的日期格式了。
下面详细说明程序的构造,以asp为例。
===bak_set.asp===

复制代码 代码如下:
Dim root_dir
root_dir = "/"
Dim bak_set
Set bak_set = Server.createobject("Scripting.Dictionary")
bak_set.Add "last_bak" , "2006-05-30"
bak_set.Add "file_list" , "data.mdb|system.mdb"
bak_set.Add "file_path" , "database/|database/"
bak_set.Add "bak_dir" , "backup/"
bak_set.Add "bak_date" , "2006-05-27|2006-05-28|2006-05-29|2006-05-30"
bak_set.Add "perfix" , "@"
bak_set.Add "date_out" , "2"
以上是备份设置文件,root_dir 是网站主目录的路径,是网站的一个全局设置,剩下的是备份设置,我们需要知道:要备份的文件名、路径,备份在什么地方,备份保留几天,备份文件的文件名前缀,两个经常变化的设置是最后备份日期和备份过的日期的列表。在全部的路径设置中都需要用“/”结束
Iso标准日期函数:
复制代码 代码如下:
Function IsoDate(str_date) Dim temp
If IsDate(str_date) Then
temp = Year(str_date)&"-"& Right("0"&Month(str_date),2) & "-"& Right("0" & Day(str_date),2)
Else
temp = str_date
End If
IsoDate=temp
End Function

备份函数的思路:
先将备份设置读取出到函数中的变量中,并且得到网站的服务器路径
检查备份主文件夹(例如:backup/)是否存在,当前备份文件夹(例如:backup/2006-05-30/)是否存在,然后将需要备份的文件保存到当前备份文件夹;
计算出备份文件的保存期,读取以前的备份日期列表,然后两者相比较,如果日期小于保存期则将备份文件删除,如果不需要删除则将日期转存到新变量中。
生成新的备份设置并将之写入原设置文件。
具体程序如下:
复制代码 代码如下:
'==================================
' Function: 文件定时备份程序backup files
' Need var: root_dir , bak_set , isodate()
' Need file bak_set.asp
' return : true / false
'==================================
Function bak_start()
'1
Dim perfix
perfix = bak_set("perfix")
Dim files
files = split(bak_set("file_list"),"|")
Dim paths
paths = split(bak_set("file_path"),"|")
Dim now_date
now_date = isodate(date)
'response.Write(now_date)
Dim sev_root
sev_root = Server.MapPath(root_dir)
Dim bak_root
bak_root = sev_root & "\" & bak_set("bak_dir")
Dim bak_dir
bak_dir = bak_root & "\" & now_date & "\"
'2 create backup
Dim fso
Set fso = Server.createobject("Scripting.FileSystemObject")
If Not fso.FolderExists(bak_root) Then fso.CreateFolder(bak_root)
If Not fso.FolderExists(bak_dir) Then fso.CreateFolder(bak_dir)
'response.Write(bak_dir)
If Ubound(files) > Ubound(paths) Then
bak_start = false
Exit Function
End If
Dim i
'On Error Resume Next
For i = 0 To Ubound(files)
'response.Write(sev_root & "\" & paths(i) & files(i))
If fso.FileExists( sev_root & "\" & paths(i) & files(i) ) And Not fso.FileExists(bak_dir & perfix & files(i)) Then
fso.CopyFile sev_root & "\" & paths(i) & files(i) , bak_dir & perfix & files(i)
End If
Next
'3 Delete out of date backup
Dim date_out
date_out = isodate( date - Abs(bak_set("date_out")) )
'response.Write(date_out)
Dim dates
Dim bak_date
bak_date = ""
dates = split(bak_set("bak_date"),"|")
For i = 0 To Ubound(dates)
If dates(i) < date_out Then
'On Error Resume Next
If fso.FolderExists(bak_root & "\" & dates(i)) Then fso.DeleteFolder bak_root & "\" & dates(i)
Else
bak_date = bak_date & dates(i) & "|"
End If
Next
bak_date = bak_date & now_date
bak_set("bak_date") = bak_date
'4 update settings
Dim f
Set f = fso.OpenTextFile(Server.MapPath("bak_set.asp"),2,true)'2 写
Dim temp ,keys
temp = "<%" &vbCrlf & _
"Dim root_dir"&vbCrlf & _
"root_dir = """& root_dir &"""" &vbCrlf & _
"Dim bak_set" &vbCrlf & _
"Set bak_set = Server.createobject(""Scripting.Dictionary"")"&vbCrlf
keys = bak_set.Keys
For i = 0 to Ubound(keys)
temp = temp & "bak_set.Add """&keys(i)&""" , """ & bak_set(keys(i)) & """" & vbCrlf
Next
temp = temp & "%" & ">"
f.write temp
f.Close
Set fso = Nothing
Set f = Nothing
bak_start = true
End Function
最后,也是最重要的,那就是安全问题,如果备份的文件能被浏览器打开,那后果可能是很严重的!所以应当谨慎选取备份文件夹,如果服务器允许访问网站的外部目录,那么应当把备份的路径也指定到网站外部,例如:网站根目录解析到了 XXX/htdoc/ 而你对此也有读写权限 xxx/ 那么就可以将备份文件加指定到 xxx/backup/ 这样就比较安全。如果没有这样的权限,那么就必须保证,需要备份的文件本身就是安全的。