zoukankan      html  css  js  c++  java
  • adodb.stream文件操作类详解

    <%
    ''/*******************************二进制文件操作类************************************
    ''/*作者:死在水中的鱼(死鱼)
    ''/*日期: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.Stream 对象的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
    %>

    使用“二进制文件操作类编写的[文件分割]和[文件合并]代码例子:
    <%
    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
    %>
  • 相关阅读:
    微信小程序 如何让button按钮长度变为100%
    使用%在搜索框中进行模糊查询
    vsCode中输入wx没有提示?
    uniapp的页面的生命周期:onLoad、onShow、onReady
    MySQL报错:1130Host 'LAPTOPJRI45NVC' is not allowed to connect to this Mysql server
    URLEncoder和URLDecoder
    super和this
    把MIT的算法课程看一遍
    单节点hadoop部署成功
    suse的ssh服务
  • 原文地址:https://www.cnblogs.com/meil/p/945898.html
Copyright © 2011-2022 走看看