home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 3_2004-2005.ISO / Data / Zips / __When_VB_179073982004.psc / clsParseTextFile.cls < prev    next >
Text File  |  2004-09-08  |  21KB  |  688 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4. END
  5. Attribute VB_Name = "clsParseTextFile"
  6. Attribute VB_GlobalNameSpace = False
  7. Attribute VB_Creatable = True
  8. Attribute VB_PredeclaredId = False
  9. Attribute VB_Exposed = False
  10. Attribute VB_Ext_KEY = "SavedWithClassBuilder" ,"Yes"
  11. Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
  12.  
  13. '
  14. '   clsParseTextFile.cls
  15. '
  16.  
  17. '   Created by:     Light Templer
  18. '   Started   :     05/26/2004
  19. '   Last edit :     06/15/2004
  20.  
  21. '   Purpose   :     Do some text file parsing in an object oriented, easy to use way.
  22. '                   Even for very large files we don't need many memory. (This class
  23. '                   doesn't read the whole file into memory, we are parsing
  24. '                   line-by-line. For TAIL() a ring buffer is used.)
  25. '
  26. '
  27. '                   So far this class encapsulates the following functions/properties:
  28. '                   __________________________________________________________________
  29. '                   Append()            Append a text to a file (file will be created if needed)
  30. '                   CAT()               As Unix CAT command (gives ALL lines)
  31. '                   HEAD()              As Unix HEAD command (gives first n lines)
  32. '                   TAIL()              As Unix TAIL command (gives last n lines)
  33. '                   GetTemp()           Get a unique temp path/filename
  34. '
  35. '                   CancelParsing       Abort parsing if set to true (e.g. in raised event)
  36. '                   Filter              Filter lines (comparing with VB's LIKE)
  37. '                   IgnoreEmptyLines    Ignore empty lines
  38. '                   IgnoreLinesWith     Ignore lines starting with this value (e.g. to skip comment lines)
  39. '                   LinesToHandle       Lines raised to deal with
  40. '                   LinesTotal          Number of all the lines we read from text file
  41. '                   LastErrMsg          Get last error message
  42. '                   __________________________________________________________________
  43.                                         
  44.                                         
  45. ' Update 1    :     Thx for the hint to Sven Maes! If 'IgnoreLinesWith' was empty, ALL lines were skiped. Fixed.
  46. ' Update 2    :     This one I discovered by myself. The check for missing path/filename was against the wrong var.
  47.                                         
  48.                                         
  49. ' SHORT EXAMPLE:
  50. '
  51. '   Private WithEvents oTEXT As clsParseTextFile
  52. '_________________________________________________
  53. '
  54. '   Private Sub main()
  55. '
  56. '      Set oTEXT = New clsParseTextFile
  57. '      With oTEXT
  58. '          .IgnoreEmptyLines = True
  59. '          .IgnoreLinesWith = "'"
  60. '          .Head 10, "C:\Temp\testfile.txt"         ' Show first 10 lines of this file
  61. '          Debug.Print "Total lines:  " & .LinesTotal & ",  handled lines:  " & .LinesToHandle
  62. '      End With
  63. '      Set oTEXT = Nothing
  64. '   End Sub
  65. '
  66. '   Private Sub oTEXT_Error(sErrMsg As String, lLineNo As Long)
  67. '      Debug.Print "Error:  " & sErrMsg & " - Line# " & lLineNo
  68. '   End Sub
  69. '
  70. '   Private Sub oTEXT_HandleLine(lLineNo As Long, sLine As String)
  71. '      Debug.Print lLineNo, sLine
  72. '   End Sub
  73.  
  74.  
  75.  
  76.  
  77. Option Explicit
  78. Option Compare Text                     ' Change to 'Option Compare Binary', if the 'Filter' property (VB 'Like'
  79.                                         ' used in 'IsLineValid()' doesn't what you want!
  80.  
  81.  
  82. ' *******************************
  83. ' *           EVENTS            *
  84. ' *******************************
  85. Public Event HandleLine(lLineNo As Long, sLine As String)
  86. Public Event Error(sErrMsg As String, lLineNo As Long)
  87.  
  88.  
  89.  
  90. ' *************************************
  91. ' *        API DEFINITIONS            *
  92. ' *************************************
  93. Private Declare Function API_GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" _
  94.         (ByVal Path As String, _
  95.          ByVal PrefixString As String, _
  96.          ByVal Unique As Long, _
  97.          ByVal TempFileName As String) As Long
  98.  
  99. Private Declare Function API_GetTempPath Lib "kernel32" Alias "GetTempPathA" _
  100.         (ByVal nBufferLength As Long, _
  101.          ByVal lpBuffer As String) As Long
  102.  
  103.  
  104.  
  105. ' *************************************
  106. ' *        PRIVATE TYPES              *
  107. ' *************************************
  108.  
  109. ' Here we hold all local info in a handy way
  110. Private Type tpMvars
  111.     sPathFilename       As String       ' Input
  112.     sOutputFile         As String       ' Output (used with Append() only!)
  113.     sErrMsg             As String       ' Last Error
  114.     
  115.     sIgnoreLinesWith    As String       ' e.g. = ";" -> we ignore lines when there first non-space char
  116.                                         '  is ";" .  Used to ignore comments or so
  117.                                         
  118.     sRegExp             As String       ' For filtering lines with VB's 'LIKE' string compare function
  119.     
  120.     flgIgnoreEmptyLines As Boolean
  121.     flgAbortParsing     As Boolean
  122.     
  123.     lLinesTotal         As Long
  124.     lLinesToHandle      As Long
  125. End Type
  126. Private mvars As tpMvars
  127. '
  128. '
  129. '
  130.  
  131.  
  132.  
  133. ' *************************************
  134. ' *      PUBLIC SUBS/FUNCTIONS        *
  135. ' *************************************
  136.  
  137. Public Function Append(sText As String, Optional sPathFilename As String) As Boolean
  138.     ' Append a string to a file. File will be created if it doesn't exists.
  139.     ' Use it lie >> in DOS command shell/Unix shell.
  140.     ' If 'sPathFilename' is empty last output file is used. If you never have used one, you 'll get an error!
  141.     
  142.     With mvars
  143.     
  144.         ' Check parameters
  145.         If sPathFilename = "" Then
  146.             If .sOutputFile = "" Then
  147.                 .sErrMsg = "Need a filename to append text in 'Append()'"
  148.                 raiseErr .sErrMsg
  149.                     
  150.                 Exit Function
  151.             End If
  152.         Else
  153.             .sOutputFile = sPathFilename
  154.         End If
  155.         
  156.         If sText = "" Then          ' Nothing to do ... (for a new line use sText= vbCrLf !)
  157.             ' Append = True         ' Maybe you don't this reported as an error: Remove comment sign.
  158.             
  159.             Exit Function
  160.         End If
  161.         
  162.         ' Start appending
  163.         If Do_APPEND(sText, .sOutputFile) = True And .sErrMsg = "" Then
  164.             Append = True
  165.         End If
  166.     End With
  167.     
  168. End Function
  169.  
  170.  
  171. Public Function CAT(Optional sPathFilename As String = "") As Boolean
  172.     ' Returns True when parsing is done without any errors
  173.     ' As the UNIX cataloge command CAT: This gives every single line of a text file, line by line
  174.     
  175.     ResetAll
  176.     
  177.     ' Check parameters
  178.     If sPathFilename <> "" Then
  179.         mvars.sPathFilename = sPathFilename
  180.     End If
  181.     
  182.     If mvars.sPathFilename = "" Then
  183.         mvars.sErrMsg = "Need a filename to parse in procedure 'Cat()'"
  184.         mvars.flgAbortParsing = True
  185.         raiseErr mvars.sErrMsg
  186.                 
  187.         Exit Function
  188.     End If
  189.     
  190.     ' Start parsing
  191.     If Do_CAT() = True And mvars.sErrMsg = "" Then
  192.         CAT = True
  193.     End If
  194.     
  195. End Function
  196.  
  197.  
  198. Public Function GetTemp(Optional sPath As String, Optional sPrefix As String = "~") As String
  199.     ' Wrapper arround two API functions to get a new, unique filename in 'sPath'.
  200.     ' If 'sPath' is empty, we ask Windows for current temp directory.
  201.     ' If 'sPath' points to an existing directory, we get the unique filename within this directory
  202.     ' 'sPrefix' is a leading part of this filename. If empty, the default ('~') will be used.
  203.     '
  204.     ' RESULT:   A valid path/filename to open a file, e.g.  "C:\Temp\~B7.tmp"
  205.     ' On error: Result is empty and 'mvars.sErrMsg' holds the error message.
  206.  
  207.  
  208.     Const CREATION_ERROR = 0
  209.     Const MAX_PATH As Long = 260
  210.  
  211.     Dim sBuffer     As String
  212.     Dim lResult     As Long
  213.     
  214.     
  215.     ' Ensure having a path
  216.     If sPath = "" Then
  217.         sBuffer = Space$(MAX_PATH)
  218.         lResult = API_GetTempPath(MAX_PATH, sBuffer)
  219.         If lResult > 0 Then
  220.             sPath = Left$(sBuffer, lResult)
  221.         Else
  222.             mvars.sErrMsg = "Error getting Windows Temp-directory by API!"
  223.         
  224.             Exit Function
  225.         End If
  226.     End If
  227.     
  228.     ' Get a new, unique filename
  229.     sBuffer = Space$(MAX_PATH)
  230.     If API_GetTempFileName(sPath, sPrefix, 0&, sBuffer) = CREATION_ERROR Then
  231.         mvars.sErrMsg = "Error getting an unique filename in '" + sPath + "'by API!"
  232.         
  233.         Exit Function
  234.     End If
  235.     
  236.     GetTemp = Left$(sBuffer, InStr(1, sBuffer, vbNullChar) - 1)
  237.     
  238. End Function
  239.  
  240.  
  241. Public Function HEAD(NumberOfLines As Long, Optional sPathFilename As String = "") As Boolean
  242.     ' Returns True when parsing is done without any errors
  243.     ' As the UNIX command HEAD: This gives the first n lines of a text file, line by line
  244.     
  245.     ResetAll
  246.     
  247.     ' Check parameters
  248.     If NumberOfLines < 1 Then
  249.         mvars.sErrMsg = "Wrong parameter! Number of requested lines below 1 in procedure 'Head()'"
  250.         mvars.flgAbortParsing = True
  251.         raiseErr mvars.sErrMsg
  252.                 
  253.         Exit Function
  254.     End If
  255.     
  256.     If sPathFilename <> "" Then
  257.         mvars.sPathFilename = sPathFilename
  258.     End If
  259.     
  260.     If mvars.sPathFilename = "" Then
  261.         mvars.sErrMsg = "Need a filename to parse in procedure 'Head()'"
  262.         mvars.flgAbortParsing = True
  263.         raiseErr mvars.sErrMsg
  264.                 
  265.         Exit Function
  266.     End If
  267.     
  268.     ' Start parsing
  269.     If Do_HEAD(NumberOfLines) = True And mvars.sErrMsg = "" Then
  270.         HEAD = True
  271.     End If
  272.     
  273. End Function
  274.  
  275.  
  276. Public Function TAIL(NumberOfLines As Long, Optional sPathFilename As String = "") As Boolean
  277.     ' Returns True when parsing is done without any errors
  278.     ' As the UNIX command TAIL: This gives the last n lines of a text file, line by line
  279.     
  280.     ResetAll
  281.     
  282.     ' Check parameters
  283.     If NumberOfLines < 1 Then
  284.         mvars.sErrMsg = "Wrong parameter! Number of requested lines below 1 in procedure 'Tail()'"
  285.         mvars.flgAbortParsing = True
  286.         raiseErr mvars.sErrMsg
  287.                 
  288.         Exit Function
  289.     End If
  290.     
  291.     If sPathFilename <> "" Then
  292.         mvars.sPathFilename = sPathFilename
  293.     End If
  294.     
  295.     If mvars.sPathFilename = "" Then
  296.         mvars.sErrMsg = "Need a filename to parse in procedure 'Tail()'"
  297.         mvars.flgAbortParsing = True
  298.         raiseErr mvars.sErrMsg
  299.                 
  300.         Exit Function
  301.     End If
  302.     
  303.     ' Start parsing
  304.     If Do_TAIL(NumberOfLines) = True And mvars.sErrMsg = "" Then
  305.         TAIL = True
  306.     End If
  307.     
  308. End Function
  309.  
  310.  
  311.  
  312. ' *************************************
  313. ' *         PRIVATE FUNCTIONS         *
  314. ' *************************************
  315. Private Function Do_APPEND(sText As String, sPathFilename As String) As Boolean
  316.     ' Append a string to a file. File will be created if it doesn't exists.
  317.     
  318.     Dim lFhndl      As Long
  319.         
  320.     On Local Error GoTo error_handler
  321.     
  322.     
  323.     lFhndl = FreeFile
  324.     Open sPathFilename For Append As #lFhndl
  325.     Print #lFhndl, sText
  326.     Close #lFhndl
  327.     
  328.     Do_APPEND = True
  329.     
  330.     Exit Function
  331.  
  332.  
  333. error_handler:
  334.     
  335.     mvars.sErrMsg = "[" & Err.Description & "] in procedure 'Do_Append()', text was: '" & sText & "'"
  336.         
  337.     If lFhndl Then
  338.         Close #lFhndl
  339.     End If
  340.     raiseErr mvars.sErrMsg
  341.  
  342. End Function
  343.  
  344.  
  345. Private Function Do_CAT() As Boolean
  346.     ' Gives every single line of a text file, line by line
  347.     
  348.     Dim lFhndl      As Long
  349.     Dim sLine       As String
  350.  
  351.     On Local Error GoTo error_handler
  352.  
  353.  
  354.     lFhndl = FreeFile
  355.     With mvars
  356.         .flgAbortParsing = False
  357.         Open .sPathFilename For Input As #lFhndl
  358.         Do While EOF(lFhndl) = False And .flgAbortParsing = False
  359.             Line Input #lFhndl, sLine
  360.             .lLinesTotal = .lLinesTotal + 1
  361.             If IsLineValid(sLine) = True Then
  362.                 .lLinesToHandle = .lLinesToHandle + 1
  363.                 
  364.                 ' Finally, here we give the line outside
  365.                 RaiseEvent HandleLine(.lLinesToHandle, sLine)
  366.                 
  367.             End If
  368.         Loop
  369.         Close #lFhndl
  370.     End With
  371.     Do_CAT = True
  372.     
  373.     Exit Function
  374.  
  375.  
  376. error_handler:
  377.     
  378.     mvars.sErrMsg = "[" & Err.Description & "] in procedure 'Do_CAT()', text line was: " & mvars.lLinesTotal
  379.     mvars.flgAbortParsing = True
  380.     
  381.     If lFhndl Then
  382.         Close #lFhndl
  383.     End If
  384.     raiseErr mvars.sErrMsg
  385.  
  386. End Function
  387.  
  388.  
  389. Private Function Do_HEAD(lNumOfLines As Long) As Boolean
  390.     ' Gives the first n lines of a text file, line by line
  391.  
  392.     Dim lFhndl      As Long
  393.     Dim sLine       As String
  394.  
  395.     On Local Error GoTo error_handler
  396.  
  397.  
  398.     lFhndl = FreeFile
  399.     With mvars
  400.         .flgAbortParsing = False
  401.         Open .sPathFilename For Input As #lFhndl
  402.         Do While EOF(lFhndl) = False And .flgAbortParsing = False
  403.             Line Input #lFhndl, sLine
  404.             .lLinesTotal = .lLinesTotal + 1
  405.             If IsLineValid(sLine) = True Then
  406.                 .lLinesToHandle = .lLinesToHandle + 1
  407.                 ' Finally, here we give the line outside
  408.                 RaiseEvent HandleLine(.lLinesToHandle, sLine)
  409.             End If
  410.             If .lLinesToHandle >= lNumOfLines Then
  411.                 
  412.                 Exit Do
  413.             End If
  414.         Loop
  415.         Close #lFhndl
  416.     End With
  417.     Do_HEAD = True
  418.     
  419.     Exit Function
  420.  
  421.  
  422. error_handler:
  423.     
  424.     mvars.sErrMsg = "[" & Err.Description & "] in procedure 'Do_HEAD()', text line was: " & mvars.lLinesTotal
  425.     mvars.flgAbortParsing = True
  426.     
  427.     If lFhndl Then
  428.         Close #lFhndl
  429.     End If
  430.     raiseErr mvars.sErrMsg
  431.  
  432. End Function
  433.  
  434.  
  435. Private Function Do_TAIL(lNumOfLines As Long) As Boolean
  436.     ' Gives the last n lines of a text file, line by line
  437.     '
  438.     ' TACTIC:   Divided into two parts:
  439.     '           1- We read the whole text file, line by line. To avoid wasting
  440.     '              memory and to be able to parse very large files we only save
  441.     '              the last 'lNumOfLines' lines read in a circular buffer.
  442.     '           2- After this we write (raise) this buffer line by line.
  443.     '
  444.     ' HINT:     Filtering empty lines and line to ignore is done in part 1!
  445.     '           So we really got 'lNumOfLines' valid lines (or less if file is too small)
  446.     '           Because of this '.lLinesTotal' are always equal to '.lLinesToHandle' on TAIL!
  447.     
  448.     Dim lFhndl          As Long
  449.     Dim sLine           As String
  450.     Dim sLineBuffer()   As String       ' Here we hold the last 'lNumOfLines' lines in a circular buffer
  451.     Dim lPtrIntoBuffer  As Long
  452.     Dim i               As Long
  453.     
  454.     On Local Error GoTo error_handler
  455.  
  456.     ReDim sLineBuffer(1 To lNumOfLines)
  457.     lFhndl = FreeFile
  458.     With mvars
  459.         .flgAbortParsing = False
  460.         
  461.         ' Part 1 - Read in and save into ring buffer
  462.         Open .sPathFilename For Input As #lFhndl
  463.         Do While EOF(lFhndl) = False
  464.             Line Input #lFhndl, sLine
  465.             If IsLineValid(sLine) = True Then
  466.                 
  467.                 ' New position in ring buffer (reaching the end means: start from beginning!)
  468.                 lPtrIntoBuffer = lPtrIntoBuffer + 1
  469.                 If lPtrIntoBuffer > lNumOfLines Then
  470.                     lPtrIntoBuffer = 1
  471.                 End If
  472.                 
  473.                 ' Save a line a current position in ring buffer
  474.                 sLineBuffer(lPtrIntoBuffer) = sLine
  475.                 
  476.                 ' We need the true number of lines saved in buffer to get them out.
  477.                 ' Size of buffer is max for this.
  478.                 If .lLinesTotal < lNumOfLines Then
  479.                     .lLinesTotal = .lLinesTotal + 1
  480.                 End If
  481.                 
  482.             End If
  483.         Loop
  484.         Close #lFhndl
  485.         
  486.         ' Part 2 - Give the lines saved in ring buffer to caller
  487.         If .lLinesTotal > 0 Then                                    ' If we really have lines ...
  488.             lPtrIntoBuffer = IIf(.lLinesTotal < lNumOfLines, 0, lPtrIntoBuffer)
  489.             Do
  490.                 i = i + 1
  491.                 lPtrIntoBuffer = lPtrIntoBuffer + 1
  492.                 If lPtrIntoBuffer > lNumOfLines Then
  493.                     lPtrIntoBuffer = 1                              ' Jump to start when end is reached
  494.                 End If
  495.                 RaiseEvent HandleLine(i, sLineBuffer(lPtrIntoBuffer))
  496.             Loop While i < .lLinesTotal And .flgAbortParsing = False
  497.         End If
  498.         .lLinesToHandle = .lLinesTotal
  499.         
  500.     End With
  501.     Do_TAIL = True
  502.     
  503.     Exit Function
  504.  
  505.  
  506. error_handler:
  507.     
  508.     mvars.sErrMsg = "[" & Err.Description & "] in procedure 'Do_TAIL()', text line was: " & mvars.lLinesTotal
  509.     mvars.flgAbortParsing = True
  510.     
  511.     If lFhndl Then
  512.         Close #lFhndl
  513.     End If
  514.     raiseErr mvars.sErrMsg
  515.  
  516. End Function
  517.  
  518.  
  519. Private Function IsLineValid(sLine As String) As Boolean
  520.     ' Here all checking for every line is done:  Use the line or skip it?
  521.     
  522.     Dim sLineTrimed     As String
  523.    
  524.     With mvars
  525.         
  526.         sLineTrimed = Trim$(sLine)
  527.         
  528.         ' Handle empty line
  529.         If sLineTrimed = "" And .flgIgnoreEmptyLines = True Then
  530.         
  531.             Exit Function
  532.         End If
  533.         
  534.         ' Handle ignoring
  535.         If Len(.sIgnoreLinesWith) Then                      ' Changed (fixed) - thx to Sven Maes!
  536.             If Left$(sLineTrimed, Len(.sIgnoreLinesWith)) = .sIgnoreLinesWith Then
  537.             
  538.                 Exit Function
  539.             End If
  540.         End If
  541.                 
  542.         ' Handle filtering with LIKE
  543.         If Len(.sRegExp) Then
  544.             If Not (sLine Like .sRegExp) Then
  545.                 
  546.                 Exit Function
  547.             End If
  548.         End If
  549.         
  550.     End With
  551.     IsLineValid = True
  552.  
  553. End Function
  554.  
  555. Private Sub raiseErr(sErr As String)
  556.  
  557.     RaiseEvent Error(sErr, mvars.lLinesTotal)
  558.  
  559. End Sub
  560.  
  561.  
  562. Private Sub ResetAll()
  563.     ' Reset for a new start
  564.     
  565.     With mvars
  566.         .flgAbortParsing = False
  567.         .lLinesToHandle = 0
  568.         .lLinesTotal = 0
  569.         .sErrMsg = ""
  570.     End With
  571.  
  572. End Sub
  573.  
  574.  
  575.  
  576.  
  577. ' *************************************
  578. ' *           PROPERTIES              *
  579. ' *************************************
  580.  
  581. Public Property Get LinesToHandle() As Long
  582.     ' How many line were to handle (without ignored ones, e.g. when flgIgnoreEmptyLines= True !)
  583.     
  584.     LinesToHandle = mvars.lLinesToHandle
  585.  
  586. End Property
  587.  
  588. Public Property Get LinesTotal() As Long
  589.     ' How many lines in textfile
  590.     
  591.     LinesTotal = mvars.lLinesTotal
  592.  
  593. End Property
  594.  
  595. Public Property Let CancelParsing(ByVal flgAbort As Boolean)
  596.     ' Abort parsing when flag set to true (e.g. in raised event 'HandleLine()'
  597.     
  598.     mvars.flgAbortParsing = flgAbort
  599.  
  600. End Property
  601.  
  602. Public Property Get ParsingCanceled() As Boolean
  603.     ' Was parsing aborted by user?
  604.     
  605.     ParsingCanceled = mvars.flgAbortParsing
  606.  
  607. End Property
  608.  
  609. Public Property Let IgnoreEmptyLines(ByVal flgIgnore As Boolean)
  610.     ' We don't raise on empty lines
  611.     
  612.     mvars.flgIgnoreEmptyLines = flgIgnore
  613.  
  614. End Property
  615.  
  616. Public Property Get IgnoreEmptyLines() As Boolean
  617.     ' For later questions or just to be complete in properties ;)
  618.     
  619.     IgnoreEmptyLines = mvars.flgIgnoreEmptyLines
  620.  
  621. End Property
  622.  
  623. Public Property Let IgnoreLinesWith(ByVal sStartString As String)
  624.     ' We don't raise on lines starting with this string. e.g. used to ignore comment lines
  625.     
  626.     mvars.sIgnoreLinesWith = sStartString
  627.  
  628. End Property
  629.  
  630. Public Property Get IgnoreLinesWith() As String
  631.     ' For later questions or just to be complete in properties ;)
  632.     
  633.     IgnoreLinesWith = mvars.sIgnoreLinesWith
  634.  
  635. End Property
  636.  
  637. Public Property Let Filter(ByVal sRegExp As String)
  638.     ' We only raise on lines matching this 'regular expression' filter (in form of VB's 'LIKE' command)
  639.     
  640.     mvars.sRegExp = sRegExp
  641.  
  642. End Property
  643.  
  644. Public Property Get Filter() As String
  645.     ' For later questions or just to be complete in properties ;)
  646.     
  647.     Filter = mvars.sRegExp
  648.  
  649. End Property
  650.  
  651. Public Property Get LastErrMsg() As String
  652.  
  653.     LastErrMsg = mvars.sErrMsg
  654.  
  655. End Property
  656.  
  657.  
  658. Public Property Let PathFilename(ByVal sPathFilename As String)
  659.     ' Set file here or give filename as arg on parse call
  660.     
  661.     mvars.sPathFilename = sPathFilename
  662.  
  663. End Property
  664.  
  665. Public Property Get PathFilename() As String
  666.     ' File used
  667.     
  668.     PathFilename = mvars.sPathFilename
  669.  
  670. End Property
  671.  
  672. Public Property Let OutputFile(ByVal sPathFilename As String)
  673.     ' Set file here or give filename as arg on Append() call
  674.     
  675.     mvars.sOutputFile = sPathFilename
  676.  
  677. End Property
  678.  
  679. Public Property Get OutputFile() As String
  680.     ' File used for output with Append()
  681.     
  682.     OutputFile = mvars.sOutputFile
  683.  
  684. End Property
  685.  
  686.  
  687. ' #*#
  688.