2013-04-24 80 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可以这样工作)。

这只是一个想法,但我会等待其他答案或确认。