(原创)二进制文件操作类

来源:互联网 发布:软件属于什么资产 编辑:程序博客网 时间:2024/05/17 01:03

使用“二进制文件操作类编写的[文件分割]和[文件合并]代码例子:
<%
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
%>