Ответ 1
if (QFile::exists("/home/user/dst.txt"))
{
QFile::remove("/home/user/dst.txt");
}
QFile::copy("/home/user/src.txt", "/home/user/dst.txt");
В документации QFile:: copy говорится:
Если файл с именем newName уже существует, copy() возвращает false (то есть QFile не будет перезаписывать его).
Но мне нужно скопировать файл, даже если место назначения существует. Любое обходное решение, доступное в Qt для этого?
Удаление файла является очевидным решением, но оно приглашает условие гонки...
if (QFile::exists("/home/user/dst.txt"))
{
QFile::remove("/home/user/dst.txt");
}
QFile::copy("/home/user/src.txt", "/home/user/dst.txt");
Очевидным решением является, конечно, удаление файла, если он существует, перед выполнением копии.
Обратите внимание, что это делает код классическим гоночным условием, поскольку в обычной многозадачной операционной системе другой процесс может воссоздать файл между вашим приложения удалять и копировать вызовы. Это приведет к потере копии, поэтому вам нужно быть готовым (и, возможно, повторите попытку удаления, но это может привести к необходимости подсчета, чтобы вы не тратили навсегда попытки, и так далее).
Простейшая повторная попытка, о которой я могу думать, это:
while !QFile::copy("/home/user/src.txt", "/home/user/dst.txt")
{
QFile::remove("/home/user/dst.txt");
}
Но это еще не настоящее решение, поскольку некоторые условия гонки - это вещи, которые не блокируют удаление.
В настоящее время я ищу способ обработки записи веб-страницы в качестве вывода, но без автоматического обновления, когда-либо ловившего между удалением и копией.
Просто вызовите remove() перед копией();