Jump to content

Faster _FileCountLines/FileReadLine?


Biatu
 Share

Recommended Posts

The one from post #10:

#include <FileConstants.au3>
Global $hFile = FileOpen('C:\temp\text.txt') ; Open the file in read mode
$iResult = FileSetPos($hFile, 0, $FILE_END) ; Moves the current file position to the end of the file
ConsoleWrite($iResult & @CRLF)

Should return True but I always get False.

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

biatu,

F.W.I.W. This code monitors a log file and reports (email) errors found.  You may be interested in the _scan_file() routine.  It processes lines added since the last scan run...

HotKeySet('`', '_start_monitor')                        ;    "`" to initiate manual scan
HotKeySet('{ESC}', '_exit')                             ;    ESC to stop script

#include <array.au3>
#include <date.au3>
#include <File.au3>

Local $file_monitored   = @ScriptDir & '\log.log'       ;   file to monitor
Local $monitor_interval = 1                             ;   minute(s) between file check
Local $bMonitor         = False                         ;   switch to start monitor
local $oMyRet[2]                                        ;   array for error message from mail routine
local $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc") ;   error routine

; routine to start scan
AdlibRegister('_start_monitor', $monitor_interval * 60 * 1000)

; main loop, will only initiate scan when the adlib routine sets the switch
While 1
    If $bMonitor = True Then
        _scan_file()
        $bMonitor = False
    EndIf
    Sleep(500)
WEnd

; scan routine and mail formatter
Func _scan_file()

    Local $sTMP = ''
    local static $FilePos = 0

    ConsoleWrite(_Now() & ' >>>> Start scan' & @CRLF)

    ;read log file entries added since the last scan
    local $fl = fileopen($file_monitored)
    if $fl = -1 then exit msgbox(0,'','File open failed')
    if not filesetpos($fl,$FilePos,0) then exit msgbox(0,'ERROR','FileSetPos failed')
    local $mon_file = fileread($fl)
    $FilePos = filegetpos($fl)
    fileclose($fl)

    ; detect lines with the word "failure" and return the entire line
    ; format output for email
    If StringRegExp($mon_file, 'failure') Then
        $aTMP = StringRegExp($mon_file, '(.*?failure.*)\R', 3)
        $sTMP &= 'The following failures were found:' & @crlf
        for $2 = 0 to ubound($aTMP) - 1
            if $aTMP[$2] = '' then continueloop
            $sTMP &= '     ' & $aTMP[$2] & @crlf
        next
    EndIf

    ; if failures were found then send the email
    if $sTMP then
        ConsoleWrite($sTMP & @CRLF)
        ConsoleWrite('+ Sending mail...')
        _mailer($sTMP)
        ConsoleWrite(@error ? @crlf & '! Error sending mail = ' & $oMyRet[1] & @crlf : 'Send complete' & @CRLF)
    Else
        ConsoleWrite('No failures found' & @CRLF)
    endif

    ConsoleWrite(_Now() & ' >>>> Scan Complete' & @CRLF)

EndFunc   ;==>_scan_file

; adlib to set switch that initiates scan
Func _start_monitor()
    $bMonitor = True
EndFunc   ;==>_start_monitor

Func _exit()
    Exit
EndFunc   ;==>_exit

; wrapper to set variables used in _INetSmtpMailCom
Func _mailer($str)

    Local $SmtpServer       = 'the.gmail.smtp.server'       ; name of the yahoo/gmail smtp server
    Local $FromName         = 'Me'                          ; what you want to appear in you inbox "From" column
    Local $FromAddress      = 'name.of.your.gmail.account'  ; name of your yahoo account
    Local $ToAddress        = 'who.to.send.it.to'           ; who you are sending the mail to
    Local $Subject          = "Log File Exception Warning"  ; title
    Local $Body             = $str                          ; the body of the email
    Local $AttachFiles      = ""                            ; the file(s) you want to attach seperated with a ; (Semicolon) - leave blank if not needed
    Local $CcAddress        = ""                            ; address for cc - leave blank if not needed
    Local $BccAddress       = ""                            ; address for bcc - leave blank if not needed
    Local $Importance       = "Normal"                      ; Send message priority: "High", "Normal", "Low"
    Local $Username         = 'same.as.$fromaddress'        ; account username as known to the smtp server
    Local $Password         = 'password'                    ; password for the above account
    Local $IPPort           = 465                           ; GMAIL / YAHOO port used for sending the mail
    Local $ssl              = 1                             ; GMAIL / YAHOO enables/disables secure socket layer sending - put to 1 if using httpS

    $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
    If @error Then return seterror(1)
EndFunc   ;==>_mailer

Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance = "Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
    Local $objEmail = ObjCreate("CDO.Message")
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then
        $objEmail.HTMLBody = $as_Body
    Else
        $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then
        Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
        For $x = 1 To $S_Files2Attach[0]
            $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
;~          ConsoleWrite('@@ Debug : $S_Files2Attach[$x] = ' & $S_Files2Attach[$x] & @LF & '>Error code: ' & @error & @LF) ;### Debug Console
            If FileExists($S_Files2Attach[$x]) Then
                ConsoleWrite('+> File attachment added: ' & $S_Files2Attach[$x] & @LF)
                $objEmail.AddAttachment($S_Files2Attach[$x])
            Else
                ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)
                SetError(1)
                Return 0
            EndIf
        Next
    EndIf
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    If Number($IPPort) = 0 Then $IPPort = 25
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    If $ssl Then
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Set Email Importance
    Switch $s_Importance
        Case "High"
            $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "High"
        Case "Normal"
            $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "Normal"
        Case "Low"
            $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "Low"
    EndSwitch
    $objEmail.Fields.Update
    ; Sent the Message
    $objEmail.Send
    If @error Then
        SetError(2)
        Return $oMyRet[1]
    EndIf
    $objEmail = ""
EndFunc   ;==>_INetSmtpMailCom

Func MyErrFunc()
    $HexNumber = Hex($oMyError.number, 8)
    $oMyRet[0] = $HexNumber
    $oMyRet[1] = StringStripWS($oMyError.description, 3)
    ;ConsoleWrite("### COM Error !  Number: " & $HexNumber & "   ScriptLine: " & $oMyError.scriptline & "   Description:" & $oMyRet[1] & @LF)
    SetError(1); something to check for when this function returns
    Return
EndFunc   ;==>MyErrFunc

kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Link to comment
Share on other sites

Help@FileRead:  "A negative or not defined count, reads the whole file from the current position. "

If im parsing files in excess of 200MB ur solution will fail. 

is the best solution.

What is what? What is what.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...