2010-05-26 179 views
6

我正在使用Ruby中的系統命令轉換XLS 2 CSV文件。如何等待系統命令結束

轉換後,我正在處理CSV文件,但當程序想要處理文件時轉換仍在運行,所以當時它們不存在。

有人能告訴我是否可以讓Ruby等待系統命令完成的正確時間?

現在我使用:

sleep 20 

,但如果它會需要更長的時間一次,這是不對的,當然。

我要做的具體是這樣的:

#Call on the program to convert xls 
command = "C:/Development/Tools/xls2csv/xls2csv.exe C:/TDLINK/file1.xls" 
system(command) 
do_stuff 

def do_stuff 
#This is where i use file1.csv, however, it isn't here yet 
end 
+1

請向我們展示一個您當前的代碼或解釋功能的例子。據我所知,系統調用不僅僅是「卸載」的,所以我認爲你正在卸載它。 – 2010-05-26 06:17:06

+1

系統命令是否返回成功?將系統的返回值分配給一個變量,然後檢查其內容。系統命令應該同步運行。 – 2010-05-26 09:53:56

+0

當我將系統(命令)分配給一個變量時,它立即返回true。所以這不是一個選項 – Ignace 2010-05-26 11:39:11

回答

1

嘗試使用線程:

command = Thread.new do 
    system('ruby programm.rb') # long-long programm 
end 
command.join     # main programm waiting for thread 
puts "command complete" 
+12

如何使用不同於在主線程中使用系統命令的輔助線程?如果系統命令在主線程中異步運行,它也將在輔助線程中運行。所以當系統命令仍在運行時,連接立即結束。 – Aurril 2010-05-26 07:40:38

13

Ruby的system("...")方法是同步的;即它等待它所調用的命令返回一個退出代碼,並且如果命令以0狀態退出,則system返回真,如果以非0狀態退出則返回假。 Ruby的反引號返回條命令的輸出:

a = `ls` 

將設置a與當前工作目錄的列表的字符串。

因此,看起來xls2csv.exe在它完成它應該做的事情之前返回一個退出代碼。也許這是一個Windows問題。所以它看起來像你將不得不循環,直到文件存在:

until File.exist?("file1.csv") 
    sleep 1 
end 
+0

求解y ..... – baash05 2014-02-04 05:01:46