web-dev-qa-db-ja.com

宛先が存在する場合でもファイルをコピーする(Qt内)

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

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

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

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

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

QFile::copy("/home/user/src.txt", "/home/user/dst.txt");
35
karlphillip

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

ただし、コードを開くと、古典的な 競合状態 になるため、通常のマルチタスクオペレーティングシステムでは、別のプロセスがbetweenアプリケーションの削除とコピーの呼び出し。それでもコピーは失敗するので、準備する必要があります(そして、おそらく削除を再試行しますが、これは、何度も何度も試行して費やさないように、カウントが必要になる場合があります)。

15
unwind

remove()を呼び出す前にcopy()を呼び出すだけです

5
Riho

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

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

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

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

4
LovesTha