金陽
(湖北汽車工業(yè)學(xué)院汽車工程學(xué)院,十堰湖北442002)
Labview應(yīng)用程序開發(fā)中使用支持文件相對(duì)路徑的有關(guān)問題
金陽
(湖北汽車工業(yè)學(xué)院汽車工程學(xué)院,十堰湖北442002)
用Labview開發(fā)涉及支持文件讀寫的應(yīng)用程序時(shí),常會(huì)出現(xiàn)調(diào)試正常而可執(zhí)行文件運(yùn)行時(shí)找不到支持文件路徑的錯(cuò)誤。基于一簡單示例,分析了產(chǎn)生此問題的原因并提供了解決問題的思路。
Labview;相對(duì)路徑;支持文件;應(yīng)用程序開發(fā)
Labview是一種圖形化編程語言,常用于測量測試領(lǐng)域應(yīng)用程序的開發(fā)。一個(gè)完整的應(yīng)用程序不僅涉及Labview編寫的源程序,還會(huì)讀寫很多格式的支持文件,如txt、word、excel、mdb等格式文件。為了程序的可移植性,在讀寫支持文件時(shí),常使用支持文件相對(duì)于讀寫該文件的Labview源程序文件的相對(duì)路徑??墒情_發(fā)者會(huì)發(fā)現(xiàn):Labview調(diào)試環(huán)境中運(yùn)行正常的程序在生成應(yīng)用程序后,會(huì)出現(xiàn)找不到支持文件路徑的錯(cuò)誤。本文中以一個(gè)簡單的應(yīng)用程序開發(fā)為例,分析了產(chǎn)生此問題的原因并提供了解決此問題的方法。本文中的示例用Labview 2013中文版開發(fā),并且假定讀者已具有Labveiw編程的基本技能。
開發(fā)一個(gè)Labview應(yīng)用可能需要:Labview源程序,其后綴名為“vi”,因而一個(gè)源程序也被稱為一個(gè)VI;各種數(shù)據(jù)文件,如txt、word、excel、html、mdb等格式文件。這些不能由Labview開發(fā)環(huán)境直接打開編輯,但能通過Labview程序代碼對(duì)之進(jìn)行讀寫的文件被稱為支持文件。支持文件中可以存儲(chǔ)參數(shù)缺省值、采集到的數(shù)據(jù)、測試報(bào)告等。圖1是開發(fā)某個(gè)應(yīng)用程序所需的全部相關(guān)文件在磁盤上的存儲(chǔ)路徑示意圖,包括2個(gè)VI和1個(gè)txt文件?!爸鞒绦?vi”和“to be read.txt”位于磁盤目錄“D:示例文件夾”下;“讀txt文件.vi”位于磁盤目錄“D:標(biāo)例文件夾子VIs”下。
圖1 原始文件存儲(chǔ)路徑樹示例
“to be read.txt”文件中的內(nèi)容如圖2所示。
圖2 “to be read.txt”文件中的內(nèi)容
圖1中的“主程序.vi”是啟動(dòng)VI(Starup VI),類似于其它文本編程語言中的主程序。在LabVIEW中,任何一個(gè)VI都可以被其它VI調(diào)用而成為一個(gè)子VI,即子程序。此子VI又可調(diào)用其它VI,使后者成為更下一層的子VI。處于調(diào)用層級(jí)最頂層的那個(gè)VI就是啟動(dòng)VI,程序的運(yùn)行是從它開始的。
本開發(fā)示例中,完成源程序編寫后,Labview生成的調(diào)用層級(jí)如圖3所示。
圖3 啟動(dòng)VI的調(diào)用層級(jí)示例
圖3表示“主程序.vi”是啟動(dòng)VI,它調(diào)用了“讀txt文件.vi”,即后者是前者的子VI。預(yù)期的程序運(yùn)行過程如下:1)出現(xiàn)“主程序.vi”的前面板窗口(圖4 a);2)當(dāng)用戶點(diǎn)圖4 a上的“退出”按鈕時(shí),程序運(yùn)行完畢;3)當(dāng)用戶點(diǎn)擊圖4 a上的“讀txt文件”按鈕時(shí),彈出“讀txt文件.vi”的前面板(圖4 b),文本框“txt文件中的內(nèi)容:”中立即顯示出“to be read.txt”文件中的全部文本。窗口1會(huì)一直保持,直至用戶點(diǎn)擊“返回”按鈕后,此窗口關(guān)閉并回到窗口2,等待用戶操作。
圖4 應(yīng)用程序運(yùn)行時(shí)的窗口
“讀txt文件.vi”的功能是:從“to be read.txt”讀出文件內(nèi)容,并顯示在其前面板窗口中的文本框“txt文件中的內(nèi)容:”中??梢姀膱D3的調(diào)用層級(jí)圖中是不能看出VI是否有讀寫支持文件的操作的?!白xtxt文件.vi”的前面板及與讀寫文件相關(guān)的框圖程序(源代碼)分別如圖5~6所示,圖6中包含了幫助理解代碼意義的注釋,位于黑色方框內(nèi)。
為了保證源代碼的可移值性,圖6在獲取txt文件的路徑時(shí)不是用其絕對(duì)路徑,而是用其相對(duì)于“讀txt文件.vi”的相對(duì)路徑。在此示例中,“當(dāng)前VI路徑”函數(shù)的輸出將是“D:示例文件夾子VIs讀txt文件.vi”,那么經(jīng)過“..”運(yùn)算后,路徑成為“D:示例文件夾子VIs”;此路徑再經(jīng)“..”運(yùn)算,成為“D:示例文件夾”;“D:示例文件夾”再經(jīng)與“ o be read.txt”運(yùn)算,就是“D:示例文件夾 o be read.txt”,這剛好是“to be read.txt”文件的絕對(duì)路徑。
在Labview環(huán)境中運(yùn)行“讀txt文件.vi”,得到的結(jié)果如圖4 b所示,沒有錯(cuò)誤。
圖5 “讀txt文件.vi”的前面板
圖6 “讀txt文件.vi”的部分框圖程序
為了調(diào)試程序及方便理解下述問題,在“讀txt文件.vi”的前面板上將程序運(yùn)行的3個(gè)中間結(jié)果(圖7)顯示出來,其值與上述分析一致。
如果將整個(gè)“示例文件夾”目錄移動(dòng)或拷貝到當(dāng)前電腦或其它電腦任意目錄下,“讀txt文件.vi”與“to be read.txt”的絕對(duì)路徑發(fā)生了變化,但由于兩者間的相對(duì)路徑?jīng)]有變,所以程序代碼無需修改,這就是源代碼的可移植性。
圖7 顯示中間結(jié)果的“讀txt文件.vi”前面板
2.1 應(yīng)用程序?qū)傩栽O(shè)置與生成
此處略去生成應(yīng)用程序的一般步驟[1],著重提及與支持文件路徑有關(guān)的方面。
下面將生成一個(gè)以“主程序.vi”為啟動(dòng)VI的名為“路徑示例.exe”的可執(zhí)行文件,擬將該可執(zhí)行文件放在“D:uilds應(yīng)用程序“目錄下。這需要在應(yīng)用程序?qū)傩栽O(shè)置窗口中進(jìn)行相應(yīng)設(shè)置,見圖8。還需要將“主程序.vi”從圖9所示窗口中的“項(xiàng)目文件”窗格中選中,送入圖中的“啟動(dòng)VI”窗格;并將這個(gè)主程序及其子VI需要的全部支持文件從“項(xiàng)目文件”窗格中選中,送入圖9中的“始終包括”窗格。完成以上操作后的窗口如圖9所示。
圖8 應(yīng)用程序目標(biāo)目錄設(shè)置
圖9 選擇啟動(dòng)VI與支持文件
接下來,需要設(shè)定支持文件的存放目錄,這里嘗試將它放到與exe文件相同的目錄下(圖10)。
圖10 支持文件的保存目錄設(shè)定界面
以上設(shè)置完成后,點(diǎn)擊應(yīng)用程序?qū)傩栽O(shè)置窗口中的“生成”按鈕讓Labview創(chuàng)建可執(zhí)行文件。生成過程結(jié)束后,目標(biāo)文件夾下的內(nèi)容如圖11所示??梢?,Labview遵從設(shè)置,將exe文件存放到了指定的目錄下,并將支持文件復(fù)制到了指定目錄下。
圖11 應(yīng)用程序目標(biāo)目錄下的內(nèi)容
2.2 生成exe文件后的運(yùn)行情形
運(yùn)行“路徑示例.exe”,彈出如圖4 a所示窗口,點(diǎn)擊窗口中的“讀txt文件”按鈕,會(huì)彈出“讀txt文件.vi”的界面(圖12),但與在LabVIEW開發(fā)環(huán)境下運(yùn)行VI的結(jié)果(圖7)不同,此時(shí)文本框“txt文件中的內(nèi)容”中沒有數(shù)據(jù)顯示,且“讀文件錯(cuò)誤信息”報(bào)錯(cuò),說明讀文件沒有成功。
圖12 “路徑示例.exe”文件運(yùn)行界面
從圖12所示窗口的“此VI的路徑”控件的值可知,exe調(diào)用的“讀txt文件.vi”的絕對(duì)路徑是“D:uilds應(yīng)用程序路徑示例.exe子VIs讀txt文件.vi”,這表明exe文件是個(gè)文件目錄。[2]在如圖6所示的代碼下,“讀文本文件”函數(shù)指向的文件路徑就是圖12中控件所顯示的“D:uilds應(yīng)用程序路徑示例.exe be read.txt”,而這個(gè)文件是不存在的,所以讀文本文件函數(shù)會(huì)報(bào)錯(cuò)。
生成應(yīng)用程序的過程中,Labview會(huì)將支持文件復(fù)制到指定目錄下,而磁盤上的全部相關(guān)VI會(huì)被復(fù)制封裝到exe文件中,這個(gè)文件內(nèi)甚至?xí)幽夸浺允箯?fù)制后各VI之間的相對(duì)路徑與原VI間的相對(duì)路徑保持一致。這就是圖8中Labview內(nèi)置的“保留磁盤層次結(jié)構(gòu)”打勾項(xiàng)的含義。
生成exe后,復(fù)制的支持文件與exe文件內(nèi)部讀寫支持文件VI之間的相對(duì)路徑關(guān)系如果與原始文件間的相對(duì)路徑不同,運(yùn)行exe時(shí)讀寫文件處的文件路徑就不存在,從而出現(xiàn)問題。
此外,在所有可以保持VI的磁盤層次結(jié)構(gòu)(相對(duì)路徑樹結(jié)構(gòu))的目錄中,exe文件中的路徑樹是其中路徑深度最淺的。以上述項(xiàng)目為例,圖13均滿足保留磁盤層次結(jié)構(gòu)的條件,但Labveiw會(huì)按照?qǐng)D13 a生成exe文件中的路徑樹。
圖13 保留磁盤層次結(jié)構(gòu)的可執(zhí)行文件內(nèi)的路徑樹
理解了Labview生成應(yīng)用程序的特點(diǎn),就可明白:在開發(fā)涉及讀寫支持文件的程序時(shí),如果希望生成exe后運(yùn)行無誤,關(guān)鍵是要使支持文件與讀寫該支持文件的VI間的相對(duì)磁盤路徑在生成exe前后保持不變。
舉例如下:1)在源程序開發(fā)階段,修改文件路徑(圖14),即將支持文件“to be read.txt”移到與“子VIs”目錄并列,見圖1;2)“讀txt文件.vi”的代碼僅需要改動(dòng)相對(duì)路徑字符串,如圖15所示。
圖14 修改原始文件的路徑
圖15 修改相對(duì)路徑字符串
圖16 無誤的exe運(yùn)行結(jié)果
應(yīng)用程序?qū)傩栽O(shè)置窗口的內(nèi)容保持不變(圖8~10),重新生成exe。這樣得到的應(yīng)用程序目標(biāo)目錄下的內(nèi)容從表面上看與圖11一致。但在運(yùn)行“路徑示例.exe”,并點(diǎn)擊界面上的“讀txt文件”按鈕后,彈出窗口如圖16所示,得到預(yù)期結(jié)果。
Labview生成的exe文件不僅是應(yīng)用程序執(zhí)行的入口,還是一個(gè)目錄,啟動(dòng)VI及其調(diào)用的所有Labview中源文件(子VI、菜單文件、控件文件等)都封裝在此目錄中,但支持文件不在其中而是被復(fù)制到用戶指定的目錄下。exe目錄中各文件之間的相對(duì)路徑關(guān)系與對(duì)應(yīng)的源文件在磁盤上的相對(duì)路徑關(guān)系保持一致,使exe目錄下的路徑樹深度最淺。
支持文件與讀寫這些支持文件的VI間的相對(duì)路徑關(guān)系在生成exe后如果發(fā)生變化,生成應(yīng)用程序后會(huì)由于找不相應(yīng)的文件路徑而出錯(cuò)。
在源代碼開發(fā)階段,合理安排文件的磁盤存儲(chǔ)路徑,并在應(yīng)用程序?qū)傩栽O(shè)置時(shí)相應(yīng)設(shè)置exe文件與支持文件的存放目錄,可做到在Labview環(huán)境中運(yùn)行源代碼的效果與運(yùn)行exe的效果一致。
[1]佚名.開發(fā)和發(fā)布應(yīng)用程序[CP/OL].[2013-06].http://zone.ni.com/reference/zhs-XX/help/371361K-0118/lvhowto/develop_distribute_applications/.
[2]阮奇楨.我和LabVIEW[M].北京:北京航空航天大學(xué)出版社,2009:263.
Problems about Support Files’Relative Path in Application Development with Labview
Jin Yang
(School of Automotive Engineering,Hubei University of Automotive Technology,Shiyan 442002,China)
When developing applications that involve reading from,or writing to,support files like txt, excel,word,mdb etc.format with Labview,developers often encounter a problem where the executive file can’t find the path for the support file while it works well in Labview debugging environment.Taking a simple example,the cause for the phenomena was analyzed and measure to it was provided.
Labview;relative path;support files;application development
TP311.52
A
1008-5483(2015)01-0064-04
10.3969/j.issn.1008-5483.2015.01.014
2014-01-24
金陽(1975-),女,湖北麻城人,副教授,博士,從事汽車NVH信號(hào)處理、整車性能仿真研究。E-mail:jin_yang@163.com