自用的一个vb类

    技术2022-05-11  70

    VERSION 1.0 CLASSBEGIN  MultiUse = -1  'True  Persistable = 0  'NotPersistable  DataBindingBehavior = 0  'vbNone  DataSourceBehavior  = 0  'vbNone  MTSTransactionMode  = 0  'NotAnMTSObjectENDAttribute VB_Name = "HouZi"Attribute VB_GlobalNameSpace = FalseAttribute VB_Creatable = TrueAttribute VB_PredeclaredId = FalseAttribute VB_Exposed = FalseOption Explicit'====================================================================='更新记录'侯叔敏 2006.12.15 创建'====================================================================='属性相关'   1.P_LogFile       操作记录的文件路径(注:要求绝对路径)'   2.RegEx_String    正则表达式 匹配方式 属性处理'   3.P_From_Path     源文件夹 属性处理'   4.P_To_Path       目标文件夹 属性处理'   5.Tag             备注 属性处理'   6.P_FileName      文件名 属性处理'====================================================================='事件相关'   1.TravelFolderFileProcess(strFileName As String)'   2.TravelFileLineProcess(strCurrentLine As String, lngCurrentLineNo As Long)'====================================================================='方法相关'   1.TravelFile()'       功能    遍历 P_From_Path(源文件夹)内的 P_FileName(文件名) 的每一行数据 并用TravelFileLineProcess 事件处理'   2.TravelFolder()'       功能    遍历 P_From_Path(源文件夹)内的每一个文件,并用 TravelFolderFileProcess 事件处理'   3.fDelInvaildChr()'       功能    去掉文件名内的无效字符'       参数1   strFileName'   4.ValidateString()'       功能    正则表达式匹配'       参数1   strPatternIn'       参数2   strContent'   5.FileExists()'       功能    判断文件或文件夹是否存在  ''(注意文件名不能超过128)'       参数1 strFileName'   6.ConvertToCrLf'       功能    使用 0D0A 重构文本文件即回车换行 注意:非文本文件请不要使用此功能'       参数1 strFileName'   7.ConvertToLf'       功能    使用 0A 重构文本文件即换行 注意:非文本文件请不要使用此功能'       参数1 strFileName'   8.INI_Read'       功能    通过 API 读取 INI 文件'       参数1   SectionName'       参数2   KeyName'       参数3   INIPath'       参数4   DefaultValue'   9.INI_Write'       功能    通过 API 保存 INI 文件'       参数1   SectionName'       参数2   KeyName'       参数3   Value'       参数4   INIPath'       参数5   blnDeleteKeyIfBlank'   10.IsArrayEmpty()'       功能    判断变量是不是空的array型数据'       参数1   varTemp'   11.Convert_Date()'       功能    返回一个以 strSplitChar 为分隔符的年月日的日期格式,默认返回当前日期(注:如果传入日期小于1900-01-01 则取当前日期)'       参数1   dateTemp'       参数2   strSplitChar'   12.Convert_Time()'       功能    返回一个以 strSplitChar 为分隔符的时分秒的时间格式,默认返回当前时间(注:如果传入日期小于1900-01-01 则取当前时间)'       参数1   dateTemp'       参数2   strSplitChar'   13.File_Copy()'       功能    将文件 strSource 拷贝到 strDesctation ,并判断文件是否拷贝成功,如果存在并自动覆盖'       参数1   strExistingFileName'       参数2   NewFileName'   14.File_Move()'       功能    将文件 strSource 移动到 strDesctation ,并判断文件是否移动成功'       参数1   strExistingFileName'       参数2   NewFileName'   15 File_Append()'       功能    将 strContent 的内容写入到 strfilename'       参数1   strFileName'       参数2   strContent'       参数3   CrlfFlag'=====================================================================Private Const MAX_PATH = 260Private Const OFS_MAXPATHNAME = 128Private Const OF_EXIST = &H4000Private Const MOVEFILE_REPLACE_EXISTING = &H1Private Const MOVEFILE_COPY_ALLOWED = &H2Private Type FILETIME    dwLowDateTime   As Long    dwHighDateTime  As LongEnd TypePrivate Type WIN32_FIND_DATA    dwFileAttributes    As Long    ftCreationTime      As FILETIME    ftLastAccessTime    As FILETIME    ftLastWriteTime     As FILETIME    nFileSizeHigh       As Long    nFileSizeLow        As Long    dwReserved0         As Long    dwReserved1         As Long    cFileName           As String * MAX_PATH    cAlternate          As String * 14End TypePrivate Type OFSTRUCT        cBytes As Byte        fFixedDisk As Byte        nErrCode As Integer        Reserved1 As Integer        Reserved2 As Integer        szPathName(OFS_MAXPATHNAME) As ByteEnd TypePrivate Declare Function apiOpenFile Lib "kernel32" Alias "OpenFile" (ByVal lpFileName As String, lpReOpenBuff As OFSTRUCT, ByVal wStyle As Long) As LongPrivate Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As LongPrivate Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As LongPrivate Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As LongPrivate Declare Function GetPrivateProfileString Lib "kernel32.dll" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As LongPrivate Declare Function WritePrivateProfileString Lib "kernel32.dll" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal LPString As String, ByVal lpFileName As String) As LongPrivate Declare Function MoveFileEx Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long) As LongPrivate Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As LongPrivate Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As LongPublic Event TravelFolderFileProcess(strFileName As String)Public Event TravelFileLineProcess(strCurrentLine As String, lngCurrentLineNo As Long)Private HouZi_From_Path     As StringPrivate HouZi_To_Path       As StringPrivate HouZi_RegEx_String  As StringPrivate HouZi_Tag           As StringPrivate HouZi_FileName      As StringPrivate Houzi_LogFile       As StringPrivate Houzi_State         As String'=====================================================================' 类初始化'=====================================================================Private Sub Class_Initialize()    Houzi_LogFile = App.Path + "/Sys_Log_" + Replace(Replace(Date, "/", ""), "-", "") + ".log"End Sub'=====================================================================' 当前操作状态'=====================================================================Public Property Get P_State() As String    P_State = Houzi_StateEnd PropertyPublic Property Let P_State(strState As String)    If strState <> "" Then         Houzi_State = strState    End IfEnd Property'=====================================================================' 操作记录的文件路径(注:要求绝对路径)'=====================================================================Public Property Get P_LogFile() As String    P_LogFile = Houzi_LogFileEnd PropertyPublic Property Let P_LogFile(Absolute_Path As String)    If Absolute_Path <> "" Then         Houzi_LogFile = Absolute_Path    End IfEnd Property'=====================================================================' 正则表达式 匹配方式 属性处理'=====================================================================Public Property Get RegEx_String() As String    RegEx_String = HouZi_RegEx_StringEnd PropertyPublic Property Let RegEx_String(strPatternIn As String)    If strPatternIn <> "" Then         HouZi_RegEx_String = strPatternIn    End IfEnd Property'=====================================================================' 源文件夹 属性处理'=====================================================================Public Property Get P_From_Path() As String    P_From_Path = HouZi_From_PathEnd PropertyPublic Property Let P_From_Path(strFromFolder As String)    If strFromFolder <> "" Then         HouZi_From_Path = strFromFolder    End IfEnd Property'=====================================================================' 目标文件夹 属性处理'=====================================================================Public Property Get P_To_Path() As String    P_To_Path = HouZi_To_PathEnd PropertyPublic Property Let P_To_Path(strToFolder As String)    If strToFolder <> "" Then         HouZi_To_Path = strToFolder    End IfEnd Property'=====================================================================' 备注 属性处理'=====================================================================Public Property Get Tag() As String    Tag = HouZi_TagEnd PropertyPublic Property Let Tag(strTemp As String)    If strTemp <> "" Then         HouZi_Tag = strTemp    End IfEnd Property'=====================================================================' 文件名 属性处理'=====================================================================Public Property Get P_FileName() As String    P_FileName = HouZi_FileNameEnd PropertyPublic Property Let P_FileName(Only_FileName As String)    If Only_FileName <> "" Then         HouZi_FileName = Only_FileName    End IfEnd Property'=====================================================================' 去掉文件名内的无效字符'=====================================================================Public Function fDelInvaildChr(strFileName As String) As String    'on error resume next    Dim I As Long    For I = Len(strFileName) To 1 Step -1        If Asc(Mid(strFileName, I, 1)) <> 0 And Asc(Mid(strFileName, I, 1)) <> 32 Then            fDelInvaildChr = Left(strFileName, I)            Exit For        End If    NextEnd Function'=====================================================================' 正则表达式匹配'=====================================================================Public Function ValidateString(strPatternIn As String, strContent As String) As Boolean    'on error resume next    Dim blnMatche   As Boolean    Dim regEx       As New RegExp         '建立正则表达式。    regEx.IgnoreCase = True         '设置是否区分字符大小写。    regEx.Global = True             '设置全局可用性。    regEx.Pattern = strPatternIn    '设置模式。    blnMatche = regEx.Test(strContent)    ValidateString = blnMatche    Set regEx = NothingEnd Function'=====================================================================' 判断文件或文件夹是否存在(注意文件名不能超过128)'=====================================================================Public Function FileExists(ByVal strFileName As String) As Boolean    'on error resume next'使用 api pathfileexists 会用到 shlwapi.dll 系统文件    If Len("" & strFileName) > 3 Then        FileExists = CBool(PathFileExists(strFileName))    Else        FileExists = False    End If'使用 apiopenfile 但有128限制'    Dim typOfStruct As OFSTRUCT'    If Len(strFileName) > 0 And LenB(strFileName) <= 128 Then'        apiOpenFile strFileName, typOfStruct, OF_EXIST'        FileExists = typOfStruct.nErrCode <> 2'    End IfEnd Function'=====================================================================' 使用 0D0A 重构文本文件即回车换行' 注意:非文本文件请不要使用此功能'=====================================================================Public Function ConvertToCrLf(strFileName As String)    'on error resume next    Dim intFileNum  As Integer    Dim strTemp     As String    intFileNum = FreeFile    Open strTemp + HouZi_FileName For Binary As #intFileNum        strTemp = Space(LOF(intFileNum))        Get intFileNum, , strTemp    Close #intFileNum    strTemp = Replace(strTemp, vbCrLf, vbLf)    strTemp = Replace(strTemp, vbCr, vbLf)    strTemp = Replace(strTemp, vbLf, vbCrLf)    intFileNum = FreeFile    Open strFileName For Output As #intFileNum    Print #intFileNum, strTemp;    Close #intFileNumEnd Function'=====================================================================' 使用 0A 重构文本文件即换行' 注意:非文本文件请不要使用此功能'=====================================================================Public Function ConvertToLf(strFileName As String)    'on error resume next    Dim intFileNum  As Integer    Dim strTemp     As String    intFileNum = FreeFile    Open strTemp + HouZi_FileName For Binary As #intFileNum        strTemp = Space(LOF(intFileNum))        Get intFileNum, , strTemp    Close #intFileNum    strTemp = Replace(strTemp, vbCr, "")    Open strFileName For Output As #intFileNum    Print #intFileNum, strTemp;    Close #intFileNumEnd Function'=====================================================================' 通过 API 读取 INI 文件'=====================================================================Public Function INI_Read(ByVal SectionName As String, ByVal KeyName As String, ByVal INIPath As String, Optional ByVal DefaultValue As String = "") As String    On Error Resume Next    Dim lngLength As Long    If FileExists(INIPath) Then        INI_Read = String(MAX_PATH, Chr(0))        lngLength = GetPrivateProfileString(SectionName & Chr(0), KeyName & Chr(0), DefaultValue & Chr(0), INI_Read, Len(INI_Read), INIPath & Chr(0))        INI_Read = Left(INI_Read, lngLength)    Else        End IfEnd Function'=====================================================================' 通过 API 保存 INI 文件'=====================================================================Public Function INI_Write(ByVal SectionName As String, ByVal KeyName As String, ByVal Value As String, ByVal INIPath As String, Optional ByVal blnDeleteKeyIfBlank As Boolean = False) As Boolean    On Error Resume Next    If blnDeleteKeyIfBlank = True Then        If SectionName = "" Then            SectionName = vbNullString        Else            SectionName = SectionName & Chr(0)        End If        If KeyName = "" Then            KeyName = vbNullString        Else            KeyName = KeyName & Chr(0)        End If        If Value = "" Then            Value = vbNullString        Else            Value = Value & Chr(0)        End If    Else        SectionName = SectionName & Chr(0)        KeyName = KeyName & Chr(0)        Value = Value & Chr(0)    End If    If WritePrivateProfileString(SectionName, KeyName, Value, INIPath & Chr(0)) <> 0 Then        INI_Write = True    End IfEnd Function'=====================================================================' 判断变量是不是空的array型数据'=====================================================================Public Function IsArrayEmpty(varTemp As Variant) As Boolean    Dim lngTemp As Long    On Error Resume Next    lngTemp = LBound(varTemp, 1)    IsArrayEmpty = (Err <> 0)    Err = 0End Function'=====================================================================' 返回一个以strTemp为分隔符的年月日的日期格式,默认返回当前日期(注:如果传入日期小于1900-01-01 则取当前日期)'=====================================================================Public Function Convert_Date(Optional dateTemp As Date, Optional strSplitChar As String = "-") As String    If dateTemp < CDate("1900-01-01") Then        dateTemp = Date    End If    Convert_Date = CStr(Year(dateTemp)) + strSplitChar + Right("00" + CStr(Month(dateTemp)), 2) + strSplitChar + Right("00" + CStr(Day(dateTemp)), 2)End Function'=====================================================================' 返回一个以strTemp为分隔符的时分秒的时间格式,默认返回当前时间(注:如果传入日期小于1900-01-01 则取当前时间)'=====================================================================Public Function Convert_Time(Optional dateTemp As Date, Optional strSplitChar As String = ":") As String    If dateTemp < CDate("1900-01-01") Then        dateTemp = Now()    End If    Convert_Time = Right("00" + CStr(Hour(dateTemp)), 2) + strSplitChar + Right("00" + CStr(Minute(dateTemp)), 2) + strSplitChar + Right("00" + CStr(Second(dateTemp)), 2)End Function'=====================================================================' 将文件 strSource 拷贝到 strDesctation ,并判断文件是否拷贝成功,如果存在并自动覆盖'=====================================================================Public Function File_Copy(strExistingFileName As String, NewFileName As String) As Boolean    'On Error Resume Next    Dim lngTemp As Long    lngTemp = CopyFile(strExistingFileName, NewFileName, MOVEFILE_REPLACE_EXISTING + MOVEFILE_COPY_ALLOWED)    If lngTemp <> 0 Then        File_Copy = FileExists(NewFileName)    Else        File_Copy = False    End IfEnd Function'=====================================================================' 将文件 strSource 移动到 strDesctation ,并判断文件是否移动成功'=====================================================================Public Function File_Move(strExistingFileName As String, NewFileName As String) As Boolean    'On Error Resume Next    Dim lngTemp As Long    lngTemp = MoveFileEx(strExistingFileName, NewFileName, MOVEFILE_REPLACE_EXISTING + MOVEFILE_COPY_ALLOWED)    If lngTemp <> 0 Then        File_Move = FileExists(NewFileName)    Else        File_Move = False    End IfEnd Function'=====================================================================' 遍历 P_From_Path(源文件夹)内的 P_FileName(文件名) 的每一行数据,' 并且TravelFileLineProcess处理得到的每一行的数据'=====================================================================Public Sub TravelFile()    'on error resume next    Dim intFileNum      As Integer    Dim strCurrentLine  As String    Dim strTemp         As String    Dim arrayTemp()     As String    Dim intTemp         As Integer        strTemp = HouZi_From_Path    If Right(strTemp, 1) <> "/" Then strTemp = strTemp + "/"    If FileExists(strTemp + HouZi_FileName) = False Then        '文件已经不存在        Exit Sub    End If        intFileNum = FreeFile    Open strTemp + HouZi_FileName For Binary As #intFileNum        strTemp = Space(LOF(intFileNum))        Get intFileNum, , strTemp    Close #intFileNum        arrayTemp = Split(strTemp, vbCrLf)    If Not IsArrayEmpty(arrayTemp) Then        For intTemp = 0 To UBound(arrayTemp)            RaiseEvent TravelFileLineProcess(arrayTemp(intTemp), intTemp + 1)        Next    End If    End Sub'=====================================================================' 遍历 P_From_Path(源文件夹)内的每一个文件' 并用 TravelFolderFileProcess 事件来处理'=====================================================================Public Sub TravelFolder()    'on error resume next    Dim lHandle     As Long      'FindFirstFileA 的句柄    Dim tFindData   As WIN32_FIND_DATA '    Dim strFileName As String '文件名    Dim Flag        As Long    Dim str_Temp    As String        str_Temp = HouZi_From_Path    If Right(str_Temp, 1) <> "/" Then str_Temp = str_Temp + "/"    lHandle = FindFirstFile(HouZi_From_Path & "*.*", tFindData)    If lHandle = 0 Then '查询结束或发生错误        Exit Sub    End If    If tFindData.dwFileAttributes >= &H10 And tFindData.dwFileAttributes < &H20 Then '目录        '目录不处理    Else        '要处理第一个哦        strFileName = fDelInvaildChr(tFindData.cFileName)        If ValidateString(HouZi_RegEx_String, strFileName) Then            RaiseEvent TravelFolderFileProcess(strFileName)        End If    End If    '处理    Flag = 1    Do While Flag        tFindData.cFileName = ""        Flag = FindNextFile(lHandle, tFindData)        If tFindData.dwFileAttributes >= &H10 And tFindData.dwFileAttributes < &H20 Then                '目录不处理        Else            strFileName = fDelInvaildChr(tFindData.cFileName)            If ValidateString(HouZi_RegEx_String, strFileName) Then                RaiseEvent TravelFolderFileProcess(strFileName)            End If        End If    Loop    FindClose (lHandle)End Sub'=====================================================================' 将 strContent 的内容写入到 strfilename 注意:写入后自动追加 vbcrlf'=====================================================================Public Function File_Append(strFileName As String, strContent As String, Optional CrlfFlag As Boolean = True)    On Error Resume Next    '记着加上取文件名的路径合法性校验,及可写操作.另外程序写完后不换行,一定要注意    Dim intFileNum  As Integer    Dim strTemp     As String    intFileNum = FreeFile    Open strFileName For Append As #intFileNum    If CrlfFlag Then        Print #intFileNum, strContent    Else        Print #intFileNum, strContent;    End If    Close #intFileNumEnd FunctionPublic Sub Write_Log(LogFile As String, Optional Error_ID As String = "", Optional Error_Description As String = "", Optional Sql_Temp As String = "", Optional File_Name As String = "", Optional Txt_Line As String = "", Optional Op As String = "")    Dim Err_Str As String    Err_Str = ""    If Op <> "" Then        Err_Str = Err_Str + "Opreating:" + Op + vbCrLf        If Error_ID <> "" Then            Err_Str = Err_Str + vbTab + "Error_ID:" + Error_ID + vbCrLf        End If        If Error_Description <> "" Then            Err_Str = Err_Str + vbTab + "Error_Description:" + Error_Description + vbCrLf        End If        If Sql_Temp <> "" Then            Err_Str = Err_Str + vbTab + "Sql:" + Sql_Temp + vbCrLf        End If        If File_Name <> "" Then            Err_Str = Err_Str + vbTab + "File_Name:" + File_Name + vbCrLf        End If        If Txt_Line <> "" Then            Err_Str = Err_Str + vbTab + "Txt_Line:" + CStr(Txt_Line) + vbCrLf        End If        Call File_Append(LogFile, Convert_Time(, ":") + "," + Err_Str, False)    Else        Call File_Append(LogFile, Convert_Time(, ":") + "," + Error_ID + "," + Error_Description)    End IfEnd SubPublic Function M2U_DATE(M_DATE As String) As String    On Error Resume Next    '将 "06-JUN-2006 01:01:01" 日期格式转换为 "2006-06-30 01:01:01"    Dim Temp As String    Dim M_YEAR As String, M_MONTH As String, M_DAY As String    Temp = "JAN.FEB.MAR.APR.MAY.JUN.JUL.AUG.SEP.OCT.NOV.DEC."    M_DATE = "" + M_DATE    If Len(M_DATE) = 20 And IsNumeric(Mid(M_DATE, 8, 4)) And InStr(Temp, UCase(Mid(M_DATE, 4, 3))) And IsNumeric(Left(M_DATE, 2)) And IsDate(Right(M_DATE, 9)) Then        M2U_DATE = Mid(M_DATE, 8, 4) + "-" + Right("00" + CStr((InStr(Temp, UCase(Mid(M_DATE, 4, 3))) - 1) / 4 + 1), 2) + "-" + Left(M_DATE, 2) + Right(M_DATE, 9)    Else        M2U_DATE = "Error"    End IfEnd FunctionPublic Function U2M_DATE(U_DATE As String) As String    On Error Resume Next    '将 "20060101010101" 日期格式转换为 "2006-06-30 01:01:01"    U2M_DATE = Mid(U_DATE, 1, 4) + "-" + Mid(U_DATE, 5, 2) + "-" + Mid(U_DATE, 7, 2) + " " + Mid(U_DATE, 9, 2) + ":" + Mid(U_DATE, 11, 2) + ":" + Mid(U_DATE, 13, 2)End Function


    最新回复(0)