2013-02-18 10 views
11

W dokumentacji QFile::copy mówiskopiować plik, nawet gdy istnieje docelowy (w Qt)

Jeżeli plik o nazwie newname już istnieje, copy() zwraca false (tj QFile nie zastąpi go) .

Ale muszę skopiować plik, nawet jeśli miejsce docelowe istnieje. Jakiekolwiek obejście dostępne w Qt do tego?

Usuwanie plik jest oczywistym rozwiązaniem, ale zachęca do sytuacji wyścigu ...

+3

[ 'QFile :: Usuń '] (http://doc.qt.digia.com/qt/qfile.html#remove-2)? –

+4

Qt naprawdę lubi robić swoje życie czasami ciężko .. mogliby po prostu dodać trzeci opcjonalny parametr, aby nadpisać pliki ale nie .. – cen

Odpowiedz

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

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

Wystarczy zadzwonić usunąć() przed kopią();

13

Oczywistym rozwiązaniem jest oczywiście usunąć plik, jeśli istnieje, przed wykonaniem kopii.

Uwaga jednak, że ten sposób otwiera się kod do klasycznego race condition, ponieważ na typowej wielozadaniowym systemem operacyjnym inny proces może ponownie utworzyć plik między aplikacji usuwać i kopiować połączeń. To spowodowałoby, że kopia nadal się nie powiedzie, więc musisz być przygotowany (i być może ponownie spróbować usunąć, ale może to spowodować konieczność liczenia, aby nie wydawać na zawsze prób i na czas).

+2

Ta odpowiedź jest prawidłowa - ale jest jakaś ironia tutaj. [Kod rzeczywista dla 'QFile :: kopii()' sama] (https://github.com/radekp/qt/blob/6f5fb0be85b1d7cc9f93b615b5034c882e946301/src/corelib/io/qfile.cpp#L848) ma sytuacji wyścigu. –

4

Najprostszym ponawianie mogę myśleć to:

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

Ale to jeszcze nie jest prawdziwym rozwiązaniem, ponieważ niektóre z warunków wyścigowych są rzeczy, które nie blokują usuń.

Jestem obecnie polowania na drodze do obsługi pisząc stronę internetową jako wyjście ale bez automatycznego odświeżania kiedykolwiek połowu między usunąć i kopii.

Powiązane problemy