offline
JScript
#1


JScript
Administradores
Administradores
Sáb 23 Jul 2011, 20:25
Funções usadas para manipular o arquivo Host localizado em %Systemroot%\System32\Drivers\Etc\

Funções atuais:
Código:
;===============================================================================================================================
_HostRead( [FilePath] )
_HostReadLine( LineNumber [, FilePath ] )
_HostWrite( IP, HostName [, OverWrite [, FilePath ]])
_HostDelete( IP, HostName [, FilePath ])
;===============================================================================================================================
Comente!

Código:
#include-once
#include <Array.au3>
; #INDEX# =======================================================================================================================
; Title .........: _HostFile.au3
; AutoIt Version.: 3.2.12++
; Language.......: English
; Description ...: Functions that manipulate Host file located in %Systemroot%\System32\Drivers\Etc\Host.
; Author ........: João Carlos (jscript)
; ===============================================================================================================================

; #CURRENT# =====================================================================================================================
;_HostRead
;_HostReadLine
;_HostWrite
;_HostDelete
; ===============================================================================================================================

; #INTERNAL_USE_ONLY#============================================================================================================
;==============================================================================================================================

; #FUNCTION# ====================================================================================================================
; Name...........: _HostRead
; Description ...: Read all contents in the Host file.
; Syntax.........: _HostRead( [FilePath] )
; Parameters ....: FilePath - [optional] The default location and name is %Systemroot%\System32\Drivers\Etc\Host.
; Return values .: Success    - Sets @error = 0 and returns an two-dimensional array:
;                        $array[0][0] - Number of lines returned
;                        $array[1][0] - Line number
;                        $array[1][1] - IP number
;                        $array[1][2] - Host name
;                        ...
;                        $array[n][0] = nth Line number
;                        $array[n][1] = nth IP number
;                        $array[n][2] = nth Host name
;                     Failure   - Returns the same two-dimensional array above with all values = 0 and:
;                         Sets @error = 1 if can not be open file
; Author ........: jscript (João Carlos)
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; $aHost = _HostRead()
; ===============================================================================================================================
Func _HostRead($FilePath = "")
   Local $FileOpen, $aFileLines, $nCount, $Line = "", $RedirectIP[1][3] = [[0, 0, 0]]
   
   If $FilePath = "" Then $FilePath = @SystemDir & "\Drivers\Etc\hosts"
   ;Read the file into an array
   $FileOpen = FileOpen($FilePath, 0)
   If $FileOpen = -1 Then Return SetError(1, 0, $RedirectIP)
   Local $FileRead = FileRead($FileOpen, FileGetSize($FilePath)) & @LF
   
   $aFileLines = StringSplit(StringStripCR($FileRead), @LF)
   For $nCount = 1 To $aFileLines[0]
      $Line = StringStripWS($aFileLines[$nCount], 7)
      ; Skip comment lines proceeded by: #
      If StringLen($Line) < 10 Or StringRegExp(StringStripWS($Line, 8), "\A#") Then ContinueLoop
      ;
      $Line = StringSplit($Line, " " & Chr(9))
      ;If @error Then $Line = StringSplit($Line, Chr(9))
      If Not @error Then
         ReDim $RedirectIP[UBound($RedirectIP, 1) + 1][3]
         $RedirectIP[0][0] += 1
         $RedirectIP[$RedirectIP[0][0]][0] = $nCount
         $RedirectIP[$RedirectIP[0][0]][1] = $Line[1]
         $RedirectIP[$RedirectIP[0][0]][2] = $Line[2]
      EndIf
   Next
   FileClose($FileOpen)
   Return $RedirectIP
EndFunc

; #FUNCTION# ====================================================================================================================
; Name...........: _HostReadLine
; Description ...: Read the specified line number in Host file.
; Syntax.........: _HostReadLine( LineNumber [, FilePath ] )
; Parameters ....: LineNumber   - Specified line number to be read.
;                  FilePath    - [optional] The default location and name is %Systemroot%\System32\Drivers\Etc\Host.
; Return values .: Success    - Sets @error = 0 and returns an one-dimensional with 2 elements:
;                        $array[0] - IP number
;                        $array[1] - Host name
;                     Failure   - Sets @error = 1 and returns the same one-dimensional array above with 0 value.
; Author ........: jscript (João Carlos)
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; $aHost = _HostReadLine($array[1][0])
; ===============================================================================================================================
Func _HostReadLine($LineNumber, $FilePath = "")
   Local $FileOpen, $aFileLines, $nCount, $Line = "", $RedirectIP[2] = [0, 0]

   If $FilePath = "" Then $FilePath = @SystemDir & "\Drivers\Etc\hosts"
   ;Read the file into an array
   $FileOpen = FileOpen($FilePath, 0)
   If $FileOpen = -1 Then Return SetError(1, 0, $RedirectIP)
   Local $FileRead = FileRead($FileOpen, FileGetSize($FilePath)) & @LF
   
   $aFileLines = StringSplit(StringStripCR($FileRead), @LF)
   For $nCount = 1 To $aFileLines[0]
      $Line = StringStripWS($aFileLines[$nCount], 7)
      ; Skip comment lines proceeded by: #
      If StringLen($Line) < 10 Or StringRegExp(StringStripWS($Line, 8), "\A#") Then ContinueLoop
      
      $Line = StringSplit($Line, " ")
      If Not @error And $nCount = $LineNumber Then
         $RedirectIP[0] = $Line[1]
         $RedirectIP[1] = $Line[2]
         ExitLoop
      EndIf
   Next
   FileClose($FileOpen)
   Return $RedirectIP
EndFunc

; #FUNCTION# ====================================================================================================================
; Name...........: _HostWrite
; Description ...: Write redirections IP and HostName in the Host file.
; Syntax.........: _HostWrite( IP, HostName [, OverWrite [, FilePath ]])
; Parameters ....: IP         - IP addres.
;                  HostName      - Host name.
;              OvewrWrite   - [optional] If set to 1, over write an existe value, the defaul is 0
;                  FilePath    - [optional] The default location and name is %Systemroot%\System32\Drivers\Etc\Host.
; Return values .: Success    - Returns 1
;                  Failure   - Returns 0 and sets @error to:
;                     1 - if file is readonly
;                     2 - if file can not be open
;                           3 - if not output file in write mode
;                          4 - if file cannot be written
; Author ........: jscript (João Carlos)
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; _HostWrite($IP, $HostName, 1)
; ===============================================================================================================================
Func _HostWrite($IP, $HostName, $OverWrite = 0, $FilePath = "")
   Local $FileOpen, $aFileLines, $hWriteHandle, $nCount, $Line = "", $Flag = True, $Value0, $Value1

   If $FilePath = "" Then $FilePath = @SystemDir & "\Drivers\Etc\hosts"

   ; Check if file is readonly...
   If StringInstr(FileGetAttrib($FilePath), "R") Then Return SetError(1, 0, 0)
   ;Read the file into an array
   $FileOpen = FileOpen($FilePath, 0)
   If $FileOpen = -1 Then Return SetError(2, 0, 0)
   Local $FileRead = FileRead($FileOpen, FileGetSize($FilePath)) & @LF
   
   $aFileLines = StringSplit(StringStripCR($FileRead), @LF)

   ;Open the output file in write mode
   $hWriteHandle = FileOpen($FilePath, 2)
   If $hWriteHandle = -1 Then Return SetError(3, 0, 0)
   
   ;Loop through the array
   For $nCount = 1 To $aFileLines[0]
      $Line = StringStripWS($aFileLines[$nCount], 7)
      
      ; Skip comment lines proceeded by: #
      If StringLen($Line) < 10 Or StringRegExp(StringStripWS($Line, 8), "\A#") Then ContinueLoop
      
      $Value0 = StringRegExp($Line, "\b" & $IP & "\b")
      $Value1 = StringRegExp($Line, "\b" & $HostName & "\b")
      If ($Value0 And $Value1) Or ($OverWrite And ($Value0 Or $Value1)) Then
         $aFileLines[$nCount] = $IP & "    " & $HostName
         $Flag = False
         ExitLoop
      EndIf
   Next
   If $Flag Then _ArrayInsert($aFileLines, $aFileLines[0], $IP & "    " & $HostName)
   
   ;Write the lines back to original file.
   For $nCount = 1 To UBound($aFileLines) - 1
      $Line = StringStripWS($aFileLines[$nCount], 7)
      
      If $Line = "" Then ContinueLoop
      ;
      If FileWriteLine($hWriteHandle, $aFileLines[$nCount]) = 0 Then
         FileClose($hWriteHandle)
         Return Return SetError(4, 0, 0)
      EndIf
   Next
   FileClose($hWriteHandle)
   
   Return SetError(0, 0, 1)
EndFunc

; #FUNCTION# ====================================================================================================================
; Name...........: _HostDelete
; Description ...: Delete entries in the Host file.
; Syntax.........: _HostDelete( IP, HostName [, FilePath ])
; Parameters ....: IP         - IP addres.
;                  HostName      - Host name.
;                  FilePath    - [optional] The default location and name is %Systemroot%\System32\Drivers\Etc\Host.
; Return values .: Success    - Returns 1
;                  Failure   - Returns 0 and sets @error to:
;                     1 - if file is readonly
;                     2 - if file can not be open
;                           3 - if not output file in write mode
;                          4 - if file cannot be written
; Author ........: jscript (João Carlos)
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; _HostDelete($IP, $HostName, 1)
; ===============================================================================================================================
Func _HostDelete($IP = "", $HostName = "", $FilePath = "")
   Local $FileOpen, $aFileLines, $hWriteHandle, $nCount, $Line = "", $Flag = True

   If $FilePath = "" Then $FilePath = @SystemDir & "\Drivers\Etc\hosts"
   ; Check if file is readonly...
   If StringInstr(FileGetAttrib($FilePath), "R") Then Return SetError(1, 0, 0)
   
   ;Read the file into an array
   $FileOpen = FileOpen($FilePath, 0)
   If $FileOpen = -1 Then Return SetError(2, 0, 0)
   Local $FileRead = FileRead($FileOpen, FileGetSize($FilePath)) & @LF
   
   If ($IP <> "" And Not StringInStr($FileRead, $IP)) Or ($HostName <> "" And Not StringInStr($FileRead, $HostName)) Then _
         Return SetError(3, 0, 0)
      
   $aFileLines = StringSplit(StringStripCR($FileRead), @LF)

   ;Open the output file in write mode
   $hWriteHandle = FileOpen($FilePath, 2)
   If $hWriteHandle = -1 Then Return SetError(4, 0, 0)
   
   ;Write the lines back to original file.
   For $nCount = 1 To UBound($aFileLines) - 1
      $Line = StringStripWS($aFileLines[$nCount], 7)
      
      If $Line = "" Then ContinueLoop
      If $IP = "" And StringRegExp($Line, "\b" & $HostName & "\b") Then ContinueLoop
      If StringRegExp($Line, "\b" & $IP & "\b") And $HostName = "" Then ContinueLoop
      If StringRegExp($Line, "\b" & $IP & "\b") And StringRegExp($Line, "\b" & $HostName & "\b") Then ContinueLoop
      ;
      If FileWriteLine($hWriteHandle, $aFileLines[$nCount]) = 0 Then
         FileClose($hWriteHandle)
         Return SetError(5, 0, 0)
      EndIf
   Next
   FileClose($hWriteHandle)
   
   Return SetError(0, 0, 1)
EndFunc