Копировать файл, даже если место назначения существует (в Qt)

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

Если файл с именем newName уже существует, функция copy() возвращает false (т. е. QFile не перезапишет его).

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

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


person sashoalm    schedule 18.02.2013    source источник
comment
QFile::remove?   -  person Some programmer dude    schedule 18.02.2013
comment
Qt действительно любит иногда усложнять вам жизнь... они могли бы просто добавить третий необязательный параметр для перезаписи файлов, но нет...   -  person cen    schedule 25.11.2013


Ответы (4)


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

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

person unwind    schedule 18.02.2013
comment
Этот ответ правильный, но здесь есть некоторая ирония. Код самого QFile::copy() имеет состояние гонки. - person Nathan Osman; 22.01.2016

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

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

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

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

person LovesTha    schedule 08.10.2014
comment
Представьте, что у вас нет прав доступа к файлам для копирования/удаления. Теперь у вас есть бесконечный цикл. - person R.B.; 24.05.2018

Просто позвоните remove(), прежде чем звонить copy()

person Riho    schedule 18.02.2013

person    schedule
comment
Решение не атомарно. - person Piotr Zych; 18.05.2021