Jump to content

Recommended Posts

Posted (edited)

I cooked up this file stream thingy.  I don't like continually dealing with the file stuff.  I found it helpful, so I figured someone else might too.   It doesn't display any amazing code acrobatics but whatever.

To use it just feed it a path to a file and call it repeatedly.  The next line in the file is returned.  To close a file before the EOF is reached then call the same function with $file_stream_close.

Update: [05/15/2014] -- Reduced code duplication.

[unknown date] -- Added string stream read functions and their corresponding constants.  Didn't do the string write functions because it's kind of even less pointless than these already are.

Functions:
    file_stream_read_line
    file_stream_read_char
    file_stream_append_line
    file_stream_append_char
    file_stream_overwrite_line
    file_stream_overwrite_char
    string_stream_read_line
    string_stream_read_char

Constants: 
    $file_stream_close
    $file_stream_eof 
    $file_stream_other_error 
    $string_stream_close 
    $string_stream_eos 
    $string_stream_delim_not_found

Stream.au3

#AutoIt3Wrapper_AU3Check_Parameters=-w 1 -w 2 -w 3 -w 4 -w 6 -w 7 -d

#include-once

#include <File.au3>

#region ; String Stream

Global Const $string_stream_close = -2
Global Const $string_stream_eos = -1
Global Const $string_stream_delim_not_found = -1

; Internal
Global Const $string_stream_ready = -3

Func __string_stream_test(Const $string, ByRef $string_array)
    Switch $string
        Case $string_stream_close
            $string_array = $string_stream_ready
            Return True
  EndSwitch
 
  Return False
EndFunc

Func string_stream_read_line(Const $string)
    Local Static $string_array = StringSplit($string, @LF)

    If __string_stream_test($string, $string_array) Then Return True

    Local Static $element = 0

    Select
        Case $string_array = $string_stream_ready
            $string_array = StringSplit($string, @LF)

            $element = 0

            ContinueCase

        Case Not @error
            $element += 1

            Switch $element > $string_array[0]
                Case True
                    $string_array = $string_stream_ready
                    $element = 0
                    Return SetError($string_stream_eos, 0, False)
            EndSwitch

            Return $string_array[$element]

        Case $string_stream_delim_not_found
            $string_array = $string_stream_ready
            $element = 0
            Return SetError($string_stream_delim_not_found, 0, False)
    EndSelect
EndFunc

Func string_stream_read_char(Const $string)
    Local Static $string_array = StringSpLit($string, '')

    If __string_stream_test($string, $string_array) Then Return True

    Local Static $element = 0

    Select
        Case $string_array = $string_stream_ready
            $string_array = StringSplit($string, '')

            $element = 0

            ContinueCase

        Case Not @error
            $element += 1

            Switch $element > $string_array[0]
                Case True
                    $string_array = $string_stream_ready
                    $element = 0
                    Return SetError($string_stream_eos, 0, False)
            EndSwitch

            Return $string_array[$element]

        Case $string_stream_delim_not_found
            $string_array = $string_stream_ready
            $element = 0
            Return SetError($string_stream_delim_not_found, 0, False)
    EndSelect
EndFunc

#endregion

#region ; File Stream

Global Const $file_stream_close = -2
Global Const $file_stream_eof = -1
Global Const $file_stream_other_error = 1

; Internal
Global Const $file_stream_ready = -3
Global Const $file_stream_open_error = -1

Func __file_stream_test(Const $path, ByRef $file_open)
    Switch $path
        Case $file_stream_close
      FileClose($file_open)
      $file_open = $file_stream_ready
      Return True
  EndSwitch
 
  Return False
EndFunc

Func file_stream_read_line(Const $path)
  Local Static $file_open = FileOpen($path, $FO_READ)
 
  If __file_stream_test($path, $file_open) Then Return True

  Select
        Case $file_open = $file_stream_open_error
            $file_open = $file_stream_ready
            Return SetError(2, 1, False)

        Case $file_open = $file_stream_ready
      $file_open = FileOpen($path, $FO_READ)

      Switch $file_open
                Case $file_stream_open_error
                    $file_open = $file_stream_ready
          Return SetError(2, 2, False)
      EndSwitch

      ContinueCase

    Case $file_open >= 0
      Local Const $file_line = FileReadLine($file_open)

      Switch @error
        Case 0
          Return $file_line

        Case $file_stream_eof
          FileClose($file_open)
          $file_open = $file_stream_ready
          Return SetError($file_stream_eof, 0, False)

        Case $file_stream_other_error
          FileClose($file_open)
          $file_open = $file_stream_ready
          Return SetError($file_stream_other_error, 0, False)
            EndSwitch
  EndSelect
EndFunc

Func file_stream_read_char(Const $path)
  Local Static $file_open = FileOpen($path, $FO_READ)
 
  If __file_stream_test($path, $file_open) Then Return True

  Select
        Case $file_open = $file_stream_open_error
            $file_open = $file_stream_ready
            Return SetError(2, 1, False)

    Case $file_open = $file_stream_ready
      $file_open = FileOpen($path, $FO_READ)

      Switch $file_open
                Case $file_stream_open_error
                    $file_open = $file_stream_ready
          Return SetError(2, 2, False)
      EndSwitch

      ContinueCase

    Case $file_open >= 0
      Local Const $file_line = FileRead($file_open, 1)

      Switch @error
        Case 0
          Return $file_line

        Case $file_stream_eof
          FileClose($file_open)
          $file_open = $file_stream_ready
          Return SetError($file_stream_eof, 0, False)

        Case $file_stream_other_error
          $file_open = $file_stream_ready
          Return SetError($file_stream_other_error, 0, False)
      EndSwitch
  EndSelect
EndFunc

Func file_stream_overwrite_line(Const $line, Const $path)
  Local Static $file_open = FileOpen($path, $FO_OVERWRITE)

    Switch $path
        Case $file_stream_close
      FileClose($file_open)
      $file_open = $file_stream_ready
      Return True
    EndSwitch

  Select
        Case $file_open = $file_stream_open_error
            $file_open = $file_stream_ready
            Return SetError(2, 1, False)

    Case $file_open = $file_stream_ready
      $file_open = FileOpen($path, $FO_READ)

      Switch $file_open
        Case $file_stream_open_error
          Return SetError(2, 2, False)
      EndSwitch

      ContinueCase

    Case $file_open >= 0
      Local Const $file_line = FileWriteLine($file_open, $line)

      Switch @error
        Case 0
          Return $file_line

        Case $file_stream_eof
          FileClose($file_open)
          $file_open = $file_stream_ready
          Return SetError($file_stream_eof, 0, False)

        Case $file_stream_other_error
          $file_open = $file_stream_ready
          Return SetError($file_stream_other_error, 0, False)
      EndSwitch
  EndSelect
EndFunc

Func file_stream_overwrite_char(Const $char, Const $path)
  Local Static $file_open = FileOpen($path, $FO_OVERWRITE)

    Switch $path
        Case $file_stream_close
      FileClose($file_open)
      $file_open = $file_stream_ready
      Return True
    EndSwitch

  Select
        Case $file_open = $file_stream_open_error
            $file_open = $file_stream_ready
            Return SetError(2, 1, False)

    Case $file_open = $file_stream_ready
      $file_open = FileOpen($path, $FO_READ)

      Switch $file_open
        Case $file_stream_open_error
          $file_open = $file_stream_ready
          Return SetError(2, 2, False)
      EndSwitch

      ContinueCase

    Case $file_open >= 0
      Local Const $file_line = FileWrite($file_open, $char)

      Switch @error
        Case 0
          Return $file_line

        Case $file_stream_eof
          FileClose($file_open)
          $file_open = $file_stream_ready
          Return SetError($file_stream_eof, 0, False)

        Case $file_stream_other_error
          $file_open = $file_stream_ready
          Return SetError($file_stream_other_error, 0, False)
      EndSwitch
  EndSelect
EndFunc

Func file_stream_append_line(Const $line, Const $path)
  Local Static $file_open = FileOpen($path, $FO_APPEND)

    Switch $path
        Case $file_stream_close
      FileClose($file_open)
      $file_open = $file_stream_ready
      Return True
    EndSwitch

  Select
        Case $file_open = $file_stream_open_error
            $file_open = $file_stream_ready
            Return SetError(2, 1, False)

    Case $file_open = $file_stream_ready
      $file_open = FileOpen($path, $FO_READ)

      Switch $file_open
        Case $file_stream_open_error
          $file_open = $file_stream_ready
          Return SetError(2, 2, False)
      EndSwitch

      ContinueCase

    Case $file_open >= 0
      Local Const $file_line = FileWriteLine($file_open, $line)

      Switch @error
        Case 0
          Return $file_line

        Case $file_stream_eof
          FileClose($file_open)
          $file_open = $file_stream_ready
          Return SetError($file_stream_eof, 0, False)

        Case $file_stream_other_error
          $file_open = $file_stream_ready
          Return SetError($file_stream_other_error, 0, False)
      EndSwitch
  EndSelect
EndFunc

Func file_stream_append_char(Const $char, Const $path)
  Local Static $file_open = FileOpen($path, $FO_APPEND)

    Switch $path
        Case $file_stream_close
      FileClose($file_open)
      $file_open = $file_stream_ready
      Return True
    EndSwitch

  Select
        Case $file_open = $file_stream_open_error
            $file_open = $file_stream_ready
            Return SetError(2, 1, False)

    Case $file_open = $file_stream_ready
      $file_open = FileOpen($path, $FO_READ)

      Switch $file_open
        Case $file_stream_open_error
          $file_open = $file_stream_ready
          Return SetError(2, 2, False)
      EndSwitch

      ContinueCase

    Case $file_open >= 0
      Local Const $file_line = FileWrite($file_open, $char)

      Switch @error
        Case 0
          Return $file_line

        Case $file_stream_eof
          FileClose($file_open)
          $file_open = $file_stream_ready
          Return SetError($file_stream_eof, 0, False)

        Case $file_stream_other_error
          $file_open = $file_stream_ready
          Return SetError($file_stream_other_error, 0, False)
      EndSwitch
  EndSelect
EndFunc

#endregion

Example:

Local Const $path = "[YOUR PATH HERE]"

Local $file_stream = ''

Do
  $file_stream = file_stream_read_line($path)

    Switch @error
        Case $file_stream_close, $file_stream_other_error
            ExitLoop
        
        Case Else
            ConsoleWrite("File: " & $file_stream & @CRLF)
    EndSwitch
Until False

Enjoy!

Edited by jaberwacky
Posted

Good example usage of using Static. By the way 0 could be a "valid handle" (not the correct term, as it's an int) as AutoIt uses this to reference the iopen handle in (what I can only presume) is an array of sorts.

I'm just curious, is there a huge difference to say using FileReadLine(@ScriptFullPath) and letting AutoIt internally deal with the handle?

UDF List:

  Reveal hidden contents

Updated: 22/04/2018

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
  • Recently Browsing   0 members

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