Genero base.channel讀取外部執行指令結果

Genero語言中其實提供的Built-in函式與可應用的API並不多,因此,有時需要一些支援功能就顯的比較麻煩一些。若要用combine C/C++,程序上又較為麻煩,因此可以考慮利用base.channel的功能,在外部﹝shell上﹞執行後再由程式將執行結果讀入系統中。

01 MAIN
02     DEFINE fn CHAR(40)
03     DEFINE ex CHAR(10)
04     DEFINE ch base.Channel
05     LET ch = base.Channel.create()
06     CALL ch.setDelimiter(".")
07     CALL ch.openPipe("ls -l","r")
08     WHILE ch.read([fn,ex])
09         DISPLAY fn, "   ", ex
10     END WHILE
11     CALL ch.close()
12 END MAIN

04: 使用base.channel當然需要先進行DEFINE的動作
05: 利用LET channel_name = base.channel.create( )來創建channel
06: 設定分隔符號,讀取狀態下可設可不設
07: 如果是要讀外部指令的回傳結果,請用channel.openPipe(“指令",”r”),第二參數『r』是表示要讀取
      請注意若指令的輸出是在std err(error畫面輸出),則請導向到標準輸出﹝2>1&﹞
08: 利用ch.read讀到結束為止
11: 用完的channel請記得close否則會引發不可預期的錯誤

當然channel可以用來讀執行指令的結果,更可以用來讀取檔案。

01 MAIN
02     DEFINE i INTEGER
03     DEFINE s STRING
04     DEFINE ch base.Channel
05     LET ch = base.Channel.create()
06     CALL ch.openFile("file.txt","r")
07     LET i = 1
08     WHILE TRUE
09         LET s = ch.readLine()
10         IF ch.isEof() THEN EXIT WHILE END IF
11         DISPLAY i, " ", s
12         LET i = i + 1
13     END WHILE
14     CALL ch.close()
15 END MAIN

06: 讀取檔案時要改用openFile,並且指定檔名、指定屬性【r:read only/ w:write only(一定是開空檔案)/ a:append only(一定不是空檔案,不可讀只能寫)/ u: update檔案 / b:binary file only】
09: 此處用readLine( )表示一次讀一整行進來,注意在Genero2以上版本就要定意由string型態的變數來接
10: isEOF( )讀到檔尾符號出現
14: ch.close( )還是要記得關channel

base.channel的使用很多元,詳細資料也可參考Genero線上說明。

1 則留言

留言功能已關閉。