readfile and writefile via VLISP ActiveX

kozmos

Usenet Archive
Joined
Aug 25, 2003
Messages
27
Reaction score
0
By reference to VxReadTextFile from MENZI ENGINEERING GmbH. I create new codes to that function by using "READALL" method instead of "readline". By using "READALL", the list build will be processed in AutoLISP speed, I have not made any test about the speed difference between using "READLL" and "READLINE" method for big ASCII text file (size > 50kb, line number > 5000). Maybe somebody there can have the result.

2) As an opposite function, the new vldos-writefile function can not run as well as vldos-readfile function do. The automation returned error. Is there any one know the trap?

Following are both of the codes

;| Read all content of a text file into a list (more fast tha AutoLISP read-line)
Syntax: (vldos-readfile FilenameToRead[STRING])
ARG1: The full path file name to be read. (contain extension) Only text file can return good result.
Description:
Read all content of a text file and convert them into a list
Return Value:
[Success]: List contain text contents line by line
[F a i l]: NIL
|;
(Defun vldos-readfile
(Fil / string->list FilObj FilPth FilSys OpnFil All)
(Defun string->list (String / ID Rtn) ;;; Convert string into list by "\r\n" (if (null (setq ID (vl-string-search "\r\n" String))) (setq Rtn (list String)) (while ID (setq Rtn (cons (substr String 1 ID) Rtn) String (substr String (+ 3 ID)) ID (vl-string-search "\r\n" String) ) ) ) (setq Rtn (reverse (cons String Rtn))) Rtn ) (if (and (setq FilPth (findfile Fil)) (setq FilSys (vlax-create-object "Scripting.FileSystemObject")) ) (progn (setq FilObj (vlax-invoke FilSys "GetFile" FilPth) OpnFil (vlax-invoke FilObj "OpenAsTextStream" 1 0) All (string->list (vlax-invoke OpnFil "readall")) ) (vlax-invoke OpnFil "Close") (vlax-release-object OpnFil) (vlax-release-object FilObj) (vlax-release-object FilSys) ) ) All ) ;| Write a string list into a text file (more fast tha AutoLISP write-line)
Syntax: (vldos-writefile FileNameString[STRING] ContentStringList
  • ModeFlag[BOOLEAN]) (vldos-writefile FileNameString[STRING] ContentString[STRING] ModeFlag[BOOLEAN])
    ARG1: The filename string
    ARG2: The string or string list to write
    ARG3: The append or overwrite mode flag. nil for append, T for overwrite
    Description:
    write a string list into a file
    Return Value:
    [Success]: The file name string.
    [F a i l]: NIL
    |;
    (Defun vldos-writefile
    (Fil TXT Mode / list->string FilObj FilPth FilSys OpnFil Line) (Defun list->string (slist / line rtn) (if (= (type slist) 'str) (setq rtn slist) (progn (setq rtn "") (foreach line slist (if (null rtn) (setq rtn line) (setq rtn (strcat rtn "\r\n" line)) ) ) ) ) rtn ) (if (and Mode (findfile Fil)) (vl-file-delete Fil) ) (if (setq FilSys (vlax-create-object "Scripting.FileSystemObject")) (progn (if (null (findfile Fil)) (vlax-invoke-method FilSys "CreateTextFile" Fil 1 1) ) (if (setq FilPth (findfile Fil)) (progn (setq FilObj (vlax-invoke FilSys "GetFile" FilPth) OpnFil (vlax-invoke FilObj "OpenAsTextStream" 1 0) ) ;;; ERROR BEGIN HERE!!! (vlax-invoke OpnFil "readall") ;;; read to end, new file the end (vlax-invoke OpnFil "Write" (list->string TXT)) (vlax-invoke OpnFil "Close") (vlax-release-object OpnFil) (vlax-release-object FilObj) (vlax-release-object FilSys) ) ) ) ) filpth )
 
I took a look at that code, and thought it might be easier to just post what I use:

function to take a text file to a list

(defun FILE-TO-LST-ALL (Fil
/ FilObj FilPth FilSys OpnFil RetVal
FileH TextString)
(if (setq FilPth (findfile Fil))
(progn
(setq FilSys (vlax-create-object "Scripting.FileSystemObject") FilObj (vlax-invoke FilSys "GetFile" FilPth) OpnFil (vlax-invoke FilObj "OpenAsTextStream" 1 0) ) (while (= (vlax-get OpnFil "AtEndOfStream") 0) (setq RetVal (cons (vlax-invoke OpnFil "ReadLine") RetVal)) ) (vlax-invoke OpnFil "Close") (vlax-release-object OpnFil) (vlax-release-object FilObj) (vlax-release-object FilSys) (reverse RetVal) ) nil )
)

function to send list to a text file

(defun LST-TO-FILE-ALL (LST Fil / FilObj FilPth FilSys OpnFil RetVal) (if (setq FilPth (findfile Fil)) (progn (setq FilSys (vlax-create-object "Scripting.FileSystemObject") FilObj (vlax-invoke FilSys "GetFile" FilPth) OpnFil (vlax-invoke FilObj "OpenAsTextStream" 2 0) ) (FOREACH LINE LST (vlax-invoke OpnFil "WriteLine" LINE) ) (vlax-invoke OpnFil "Close") (vlax-release-object OpnFil) (vlax-release-object FilObj) (vlax-release-object FilSys) T ) nil )
)

Hope this helps some, the code is a lot clearer.
Note that I too learned a lot from the MENZI ENGINEERING site.

James Maeding
Civil Engineer/Programmer
 
Thanx for your reply. By little digging on WSH, i have fixed my problem.

As for the Opnfil object, there is methods called "WRITE" and "WRITELINE", "READALL" and "READLINE", is there some speed difference between the couple of commands?
 
Back
Top