Скопируйте файл, даже если он существует (в Qt)

В документации QFile:: copy говорится:

Если файл с именем newName уже существует, copy() возвращает false (то есть QFile не будет перезаписывать его).

Но мне нужно скопировать файл, даже если место назначения существует. Любое обходное решение, доступное в Qt для этого?

Удаление файла является очевидным решением, но оно приглашает условие гонки...

Ответ 1

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

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

Ответ 2

Очевидным решением является, конечно, удаление файла, если он существует, перед выполнением копии.

Обратите внимание, что это делает код классическим гоночным условием, поскольку в обычной многозадачной операционной системе другой процесс может воссоздать файл между вашим приложения удалять и копировать вызовы. Это приведет к потере копии, поэтому вам нужно быть готовым (и, возможно, повторите попытку удаления, но это может привести к необходимости подсчета, чтобы вы не тратили навсегда попытки, и так далее).

Ответ 3

Простейшая повторная попытка, о которой я могу думать, это:

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

Но это еще не настоящее решение, поскольку некоторые условия гонки - это вещи, которые не блокируют удаление.

В настоящее время я ищу способ обработки записи веб-страницы в качестве вывода, но без автоматического обновления, когда-либо ловившего между удалением и копией.

Ответ 4

Просто вызовите remove() перед копией();