2013-04-24 78 views
3

我必須從用戶讀取一個腳本,並調用QProcess將該腳本作爲文件傳遞。在QProcess中使用QTemporaryFile是否安全?

例如,用戶插入此說,Python腳本

import sys 
print(sys.copyright) 

,我必須把這個腳本在文件中,並使用該文件調用Python解釋器。

我以爲使用QTemporaryFile,因爲該文件將在啓動過程時提供服務,而且我無需保持打開狀態。

問題是:是否可以安全地打開一個QTemporaryFile,在其中寫入內容,將該文件傳遞給進程(該進程將無限期地繼續),然後銷燬該臨時文件?如果該過程再次需要該文件會怎麼樣?如果該過程保持文件打開,該怎麼辦?

我認爲,如果通過進程保持打開狀態,則不會出現問題:可能QTemporaryFile將取消鏈接路徑,但數據仍可在內存中訪問。

但是如果該進程將嘗試再次打開該文件呢?

這裏一個片斷爲例(飛寫)

QString script = QInputDialog::getText(blah); 
QTemporaryFile tmp; 
if (tmp.open()) { 
    tmp.write(script.toUtf8()); 
    QStringList params; 
    params << tmp.fileName(); 
    QProcess *proc = new QProcess("/usr/bin/python3"); 
    proc->start(params); 
} 

回答

3

據我所知,在'autoRemove'標誌(默認情況下)的情況下,QTemporaryFile將存在,只要QTemporaryFile的實例存在。因此,在您最初提供的代碼中,當tmp超出範圍時,該文件將被刪除。在對象上調用open/close不會刪除文件。

您可以動態分配帶有QTemporaryFile * pTmp = new QTemporaryFile的文件,然後在您知道Python腳本何時完成它的情況下將其刪除。

1

哎喲,我剛纔提到的autoRemove國旗在QTemporaryFile。我想這可能是一個解決方案:如果設置爲false,該文件將不會從磁盤中刪除,因此該過程可以自由重複使用該文件 - 我認爲。

臨時文件應該存儲在系統的默認位置,所以我猜這些文件在重啓之前不會被刪除(至少我相信Linux可以這樣工作)。

這只是一個想法,但我會等待其他答案或確認。