26

QFile :: copyのドキュメントには、

newNameという名前のファイルがすでに存在する場合、copy()はfalseを返します(つまり、QFileはそのファイルを上書きしません)。

ただし、宛先が存在する場合でもファイルをコピーする必要があります。そのためにQtで利用可能な回避策はありますか?

ファイルを削除することは明らかな解決策ですが、競合状態を招きます...

4

4 に答える 4

42
if (QFile::exists("/home/user/dst.txt"))
{
    QFile::remove("/home/user/dst.txt");
}

QFile::copy("/home/user/src.txt", "/home/user/dst.txt");
于 2013-02-18T12:19:46.367 に答える
17

もちろん、明らかな解決策は、コピーを実行する前に、ファイルが存在する場合はそれを削除することです。

ただし、これを行うと、コードが従来の競合状態になることに注意してください。通常のマルチタスクオペレーティングシステムでは、アプリケーションの削除呼び出しとコピー呼び出しのに別のプロセスでファイルが再作成される可能性があるためです。それでもコピーが失敗するので、準備する必要があります(おそらく削除を再試行しますが、カウントが必要になる可能性があるため、永遠に試行を繰り返す必要はありません)。

于 2013-02-18T12:22:25.680 に答える
6

私が考えることができる最も簡単な再試行は次のとおりです。

while !QFile::copy("/home/user/src.txt", "/home/user/dst.txt")
{
    QFile::remove("/home/user/dst.txt");
}

しかし、競合状態のいくつかはブロック除去されないものであるため、これはまだ実際の解決策ではありません。

私は現在、出力としてWebページの書き込みを処理する方法を探していますが、削除とコピーの間に自動更新がキャッチされることはありません。

于 2014-10-08T05:06:32.817 に答える
4

remove()電話する前に電話するだけcopy()

于 2013-02-18T12:12:22.783 に答える