将QTemporaryFile与QProcess一起使用是否安全?

时间:2013-04-24 10:30:35

标签: c++ qt temporary-files qprocess

我必须从用户那里读取一个脚本并调用QProcess将该脚本作为文件传递。

例如,用户插入此脚本,例如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);
}

2 个答案:

答案 0 :(得分:3)

据我了解,在'autoRemove'标志(默认情况下处于启用状态)的情况下,只要QTemporaryFile的实例存在,QTemporaryFile就会存在。因此,在您最初提供的代码中,当tmp超出范围时,将删除该文件。在对象上调用open / close将不会删除该文件。

您可以使用QTemporaryFile * pTmp = new QTemporaryFile动态分配文件,如果您知道python脚本何时完成它,则稍后将其删除。

答案 1 :(得分:1)

哎呀,我刚刚注意到autoRemove中的QTemporaryFile标志。我想这可能是一个解决方案:如果设置为false,该文件将不会从磁盘中删除,因此该过程可以自由重用该文件 - 我认为。

临时文件应该存储在系统的默认位置,所以我想在重启之前不会删除这些文件(至少,我相信Linux会这样工作)。

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