使用“二进制文件操作类编写的[文件分割]和[文件合并]代码例子: <% Dim obj Set obj=New FileClass '文件分隔 Dim i Obj.OpenFile "G:/2.mp3","" i=0 Do While Not Obj.Eof If Obj.NewFile("G:/2_"&i&".mp3",Obj.Read(2048*1024)) Then '分隔成2M大小的文件 Response.Write "分隔成文件G:/2_"&i&".mp3成功!<br>" Else Response.Write "分隔成文件G:/2_"&i&".mp3失败!<br>" End If i=i+1 Loop Obj.CloseFile'合并文件 Dim j Obj.AppendFile "G:/2_0.mp3","G:/2_1.mp3","G:/Mp3.mp3" For j=2 To i-1 Obj.AppendFile "G:/Mp3.mp3","G:/2_"&j&".mp3","" Next Response.Write "合并文件成功!" Set Obj=Nothing %>
类的代码: <% '/*******************************二进制文件操作类************************************ '/*作者:死在水中的鱼(死鱼) '/*日期:2004年9月7日 '/*BLOG: http://blog.csdn.net/bpfish '/* '/*用法: '/*Dim obj,sData,iPos,iSize '/*Set obj=new FileClass '/*obj.OpenFile "文件绝对路径地址","打开方式" '打开文件,打开方式的值和ADODB.Stream的Mode属性值相同 '/*打开方式的相关几个值:1 = 只读 2 = 只写 3或空值 = 读写 '/*obj.AppendTo "[追加文件]绝对路径地址" '把当前打开的文件追加到[追加文件]的末尾 '/*obj.Move 数值 '把当前打开的文件指针相对移动[数值]个字节 '/*obj.MoveTo 数值 '把当前打开的文件指针绝对于文件头移动[数值]个字节 '/*sData=obj.Read(数值) '/*'说明:obj.Read(数值)读取当前被打开的文件[数值]个字节 '/*注意:读取位置与文件指针有关,如果数值为0则从当前文件位置开始读取数据直到文件尾 '/*sData=obj.ReadAll '读取当前打开的文件所有数据 '/*iPos=obj.Position '返回当前文件的文件指针位置(Position属性是只读,不能写) '/*iSize=obj.Size '返回当前文件的大小,即字节总数 '/*If obj.Eof Then Response.Write "文件尾" '/*注意:obj.Eof是判断文件指针是否移动到了文件的末尾,当obj.Eof=True时 '/* obj.Position=obj.Size。但obj.Position=obj.Size则不一定obj.Eof=True '/*obj.SaveAs "另存为文件名","保存模式" '将当前打开的文件另存为新文件,保存模式的值是1或2 1=非覆盖 2=覆盖 '/*obj.CloseFile '关闭当前打开的文件 '/*obj.NewFile "新文件名",字节数据流 '将[字节数据流]建立一个新文件,如果文件存在则将覆盖,如果非字节数据流则新建文件失败 '/*obj.AppendFile "文件1","文件2",“生成文件" '/*'将[文件1]和[文件2]合并为一个新的[生成文件],如果[生成文件]存在,则合并失败!如果将[生成文件]置为空,则将[文件2]合并进[文件1去。 '/*Response.Write obj.GetText(字节数据流) '将[字节数据流]转换成字符串并返回 '/*Set obj=Nothing '/* '/*说明:字节数据流是二进制的数据 '/*以下方法可以不需要先OpenFile:NewFile和AppendFile和GetText方法,否则其它则必需要先使用OpenFile方法打开文件 '/********************************************************************************** Class FileClass Private ObjStream 'ADODB.Stream对象变量 Private OpenFlag '是否已有打开的文件 Private FileIsEof '/********************************************************************************** '/* 函数名:初始化类 '/********************************************************************************** Private Sub Class_Initialize OpenFlag=False FileIsEof=True End Sub'/********************************************************************************** '/* 函数名: '/********************************************************************************** Private Sub Class_Terminate Call CloseFile Set ObjStream=Nothing End Sub'/********************************************************************************** '/* 函数名:获取文件的大小(-1 = 没有打开的文件) '/********************************************************************************** Public Property Get Size If OpenFlag Then Size=ObjStream.Size Else Size=-1 End If End Property'/********************************************************************************** '/* 函数名:获取当前文件的文件指针位置(-1 = 没有打开的文件) '/********************************************************************************** Public Property Get Position If OpenFlag Then Position=ObjStream.Position Else Position=-1 End If End Property'/********************************************************************************** '/* 函数名:获取当前的文件是否在文件尾(True = 文件尾 False = 否) '/*注意:返回为True时文件只是在最后一个字节处,返回为True是因为被尝试移动指针到文件的尾部(大于文件的大小) '/* 如果外部调用此值时建议当该值为True时,停止任何的读取数据操作,否则有可能会有数据返回 '/********************************************************************************** Public Property Get Eof Eof=FileIsEof End Property '/********************************************************************************** '/* 函数名:打开文件 '/*参数: FileName = 要打开的文件名,绝对地址 '/* OpenMode = 打开文件的模式 值是同Adodb.RecordSet 对象的Mode属性相同 '/********************************************************************************** Public Function OpenFile(ByVal FileName,ByVal OpenMode) On Error Resume Next Dim sFileName,iMode If OpenFlag Then '如果已有打开文件,则关闭前一个文件 Call CloseFile End If sFileName=Trim(FileName) If sFileName="" Then FileIsEof=True OpenFlag=False OpenFile=False Exit Function End If iMode=Cint(OpenMode) '如果输入的不是数字则采用默认的3打开模式(读写型) If Err.Number<>0 Then iMode=3 Err.Clear End If If iMode<>0 And iMode<>1 And iMode<>2 And iMode<>3 And iMode<>4 And iMode<>8 And iMode<>12 And iMode<>16 And iMode<>4194304 Then iMode=3 '如果输入的数字不在ADODB.ReadStream的Mode属性所接受的值则采用默认值3 End If 'On Error Goto 0 If Not InitObjStream Then '初始化对象,如不能初始化则返回一个False值 FileIsEof=True OpenFlag=False OpenFile=False Exit Function End If ObjStream.Type=1 ObjStream.Mode=iMode ObjStream.Open ObjStream.LoadFromFile sFileName If Err.Number<>0 Then Err.Clear Exit Function End If FileIsEof=False OpenFlag=True OpenFile=True End Function'/********************************************************************************** '/* 函数名:读取指定长度的二进制内容 '/*参数: Numbytes = 要读取的字节数(Numbytes = 0 获取当前文件指针后的所有内容) '/*返回:读取的字节数据 '/********************************************************************************** Public Function Read(ByVal Numbytes) Dim iNum If Not OpenFlag Then Exit Function If Not IsInteger(Numbytes) Then Exit Function iNum=Clng(Numbytes) FileIsEof=False If iNum<0 Then Exit Function ElseIf (iNum+ObjStream.Position)>ObjStream.Size Then 'iNum=ObjStream.Size-ObjStream.Position FileIsEof=True End If If iNum=0 Then Read=ObjStream.Read Else Read=ObjStream.Read(iNum) End If End Function'/********************************************************************************** '/* 函数名:读取文件的所有内容 '/*参数: '/*返回:读取文件的所有字节数据 '/********************************************************************************** Public Function ReadAll If Not OpenFlag Then Exit Function ObjStream.Position=0 ReadAll=ObjStream.Read FileIsEof=True End Function'/********************************************************************************** '/* 函数名:文件另存为 '/*参数:FileName = 另存为文件绝对路径 Options = 文件另存为的模式 (1=非覆盖 2=覆盖) '/*返回:读取文件的所有字节数据 '/********************************************************************************** Public Function SaveAs(ByVal FileName,ByVal Options) On Error Resume Next Dim sFileName,iOption If Not OpenFlag Then SaveAs=False Exit Function End If sFileName=Trim(FileName) If sFileName="" Then SaveAs=False Exit Function End If iOption=Cint(Options) If Err.Number<>0 Then '如果非数值型数据,则采用默认值 1 = 非覆盖方式保存 iOption=1 Err.Clear End If If iOption<>1 And iOption<>2 Then '如果Options的值不在1和2的范围,则采用默认值 1 iOption=1 End If ObjStream.SaveToFile sFileName,iOption If Err.Number<>0 Then Err.Clear SaveAs=False Exit Function End If SaveAs=True End Function'/********************************************************************************** '/* 函数名:追加文件数据到另一个文件 '/*参数:FileName = 被追加的文件绝对路径 '/*返回:True = 追加数据成功 False = 追加文件数据失败 '/********************************************************************************** Public Function AppendTo(ByVal FileName) On Error Resume Next Dim sFileName,AppendObj If Not OpenFlag Then AppendTo=False Exit Function End If sFileName=Trim(FileName) If sFileName="" Then AppendTo=False Exit Function End If '打开要被追加的文件 Set AppendObj=Server.CreateObject("ADODB.Stream") AppendObj.Type=1 AppendObj.Mode=3 AppendObj.Open AppendObj.LoadFromFile sFileName If Err.Number<>0 Then Err.Clear AppendTo=False Exit Function End If AppendObj.Position=AppendObj.Size '移动指针到文件尾 AppendObj.Write ReadAll '追加数据第一个文件的数据 AppendObj.SaveToFile sFileName,2 '另存为自己 If Err.Number<>0 Then Err.Clear AppendTo=False Exit Function End If AppendObj.Close Set AppendObj=Nothing AppendTo=True End Function'/********************************************************************************** '/* 函数名:保存sData数据为一个文件 '/*参数:FileName = 被追加的文件绝对路径 '/*返回:True = 追加数据成功 False = 追加文件数据失败 '/********************************************************************************** Public Function NewFile(ByVal FileName,ByRef sData) On Error Resume Next Dim sFileName,AppendObj sFileName=Trim(FileName) If sFileName="" Then NewFile=False Exit Function End If '打开要被追加的文件 Set AppendObj=Server.CreateObject("ADODB.Stream") AppendObj.Type=1 AppendObj.Mode=3 AppendObj.Open If Err.Number<>0 Then Err.Clear NewFile=False Exit Function End If If Left(TypeName(sData),4)="Byte" Then '是字节流数据才能追加 AppendObj.Write sData '追加数据第一个文件的数据 AppendObj.SaveToFile sFileName,2 '另存为自己 Else NewFile=False Exit Function End If If Err.Number<>0 Then Err.Clear NewFile=False Exit Function End If AppendObj.Close Set AppendObj=Nothing NewFile=True End Function'/********************************************************************************** '/* 函数名:文件合并 '/*参数:AppendFileName = 合并文件1 SourceFileName = 合并文件2 TargetFileName = 合并后的文件(如为空,则保存为第一个文件名) '/*返回:True = 合并成功 False = 合并失败 '/********************************************************************************** Public Function AppendFile(ByVal AppendFileName,ByVal SourceFileName,ByVal TargetFileName) On Error Resume Next Dim sFileName1,sFileName2,AppendObj1,AppendObj2 Dim sTargetFile sFileName1=Trim(AppendFileName) sFileName2=Trim(SourceFileName) sTargetFile=Trim(TargetFileName) If sFileName1="" Or sFileName2="" Then AppendFile=False Exit Function End If '打开要被追加和追加的文件 Set AppendObj1=Server.CreateObject("ADODB.Stream") Set AppendObj2=Server.CreateObject("ADODB.Stream") AppendObj1.Type=1 AppendObj1.Mode=3 AppendObj1.Open AppendObj1.LoadFromFile sFileName1 AppendObj2.Type=1 AppendObj2.Mode=3 AppendObj2.Open AppendObj2.LoadFromFile sFileName2 If Err.Number<>0 Then Err.Clear AppendFile=False Exit Function End If AppendObj1.Position=AppendObj1.Size '移动指针到文件尾 AppendObj1.Write AppendObj2.Read '追加数据第一个文件的数据 If sTargetFile="" Then AppendObj1.SaveToFile sFileName1,2 '另存为自己 Else AppendObj1.SaveToFile sTargetFile,1 '另存为其它文件时不采用强制覆盖方式 End If If Err.Number<>0 Then Err.Clear AppendFile=False Exit Function End If AppendObj1.Close Set AppendObj1=Nothing AppendObj2.Close Set AppendObj2=Nothing AppendFile=True End Function'/********************************************************************************** '/* 函数名:移动文件指针(相对移动) '/*参数: ToNum = 要移动的字节数 '/* '/********************************************************************************** Public Sub Move(ByVal ToNum) Dim iNum If Not OpenFlag Then Exit Sub If Not IsInteger(ToNum) Then Exit Sub iNum=ObjStream.Position+Clng(ToNum) FileIsEof=False If iNum<0 Then iNum=0 ElseIf iNum>ObjStream.Size Then iNum=ObjStream.Size FileIsEof=True End If ObjStream.Position=iNum End Sub'/********************************************************************************** '/* 函数名:移动文件指针(绝对移动) '/*参数: ToNum = 要移动的字节数 '/* '/********************************************************************************** Public Sub MoveTo(ByVal ToNum) Dim iNum If Not OpenFlag Then Exit Sub If Not IsInteger(ToNum) Then Exit Sub iNum=Clng(ToNum) FileIsEof=False If iNum<0 Then iNum=0 ElseIf iNum>ObjStream.Size Then iNum=ObjStream.Size FileIsEof=True End If ObjStream.Position=iNum End Sub'/********************************************************************************** '/* 函数名:关闭已打开的文件 '/********************************************************************************** Public Sub CloseFile On Error Resume Next If Not IsNothing(ObjStream) Then ObjStream.Close End If OpenFlag=False FileIsEof=True End Sub'/********************************************************************************** '/* 函数名:初始化ObjStream对象 '/********************************************************************************** Private Function InitObjStream On Error Resume Next If IsNothing(ObjStream) Then Set ObjStream=Server.CreateObject("ADODB.Stream") If Err.Number<>0 Then Err.Clear InitObjStream=False Exit Function End If End If InitObjStream=True End Function'/********************************************************************************** '/* 函数名:获取二进制转换为字符串的数据 '/********************************************************************************** Public Function GetText(ByRef vIn) On Error Resume Next Dim strReturn, i, ThisCharCode, NextCharCode strReturn = "" For i = 1 To LenB(vIn) ThisCharCode = AscB(MidB(vIn, i, 1)) If ThisCharCode < &H80 Then strReturn = strReturn & Chr(ThisCharCode) Else NextCharCode = AscB(MidB(vIn, i + 1, 1)) strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) i = i + 1 End If Next GetText = strReturn End Function'/********************************************************************************** '/* 函数名:判断OBJ对象是否是空值 '/********************************************************************************** Private Function IsNothing(Obj) If Not IsObject(Obj) Then IsNothing=True Exit Function End If If Obj Is Nothing Then IsNothing=True Exit Function End If If IsNull(Obj) Then IsNothing=True Exit Function End If IsNothing=False End Function '/********************************************************************************** '/* 函数名:判断是否是数字值(0,1,2,3,4,5...........9) '/********************************************************************************** Private Function IsInteger(Para) On Error Resume Next Dim str Dim l,i If isNUll(para) Then IsInteger=False Exit Function End if str=Cstr(para) If Trim(str)="" Then IsInteger=False Exit Function End If l=Len(str) For i=1 To l If Mid(str,i,1)>"9" Or Mid(str,i,1)<"0" Then IsInteger=False Exit Function End if Next IsInteger=true If Err.number<>0 Then Err.clear End Function End Class %> |