2013-02-18 13 views
11

QFile::copy प्रलेखन में यह कहते हैंफाइल कॉपी भी जब गंतव्य (क्यूटी में)

नाम NewName के साथ एक फ़ाइल पहले से ही मौजूद है, तो मौजूद है, प्रतिलिपि() रिटर्न झूठी (यानी, QFile इसे अधिलेखित नहीं होगा) ।

लेकिन गंतव्य मौजूद होने पर भी मुझे एक फ़ाइल कॉपी करने की आवश्यकता है। उस के लिए क्यूटी में उपलब्ध कोई कामकाज?

फ़ाइल को हटाने से स्पष्ट समाधान है लेकिन यह एक रेस स्थिति आमंत्रित किया है ...

+3

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

+4

क्यूटी वास्तव में कभी-कभी आपके जीवन को कठिन बनाना पसंद करती है .. वे फ़ाइलों को ओवरराइट करने के लिए बस एक तीसरा वैकल्पिक पैरामीटर जोड़ सकते हैं लेकिन नहीं .. – cen

उत्तर

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

बस (कॉपी से पहले हटाने()) कहते हैं;

13

प्रतिलिपि करने से पहले फ़ाइल मौजूद होने के लिए स्पष्ट समाधान निश्चित रूप से मौजूद है।

नोट तथापि कि ऐसा करने से ऊपर कोड एक क्लासिक race condition है, क्योंकि एक ठेठ मल्टीटास्किंग ऑपरेटिंग सिस्टम पर एक अलग प्रक्रिया सकता है फ़ाइल अपने अनुप्रयोगों के बीच फिर से बनाने 'को हटाना और कॉल कॉपी खोलता है। इससे प्रतिलिपि अभी भी असफल हो जाएगी, इसलिए आपको तैयार होने की आवश्यकता है (और शायद डिलीट को फिर से प्रयास करें, लेकिन इससे गिनती की आवश्यकता हो सकती है ताकि आप हमेशा के लिए प्रयास नहीं कर सकें, और आगे)।

+2

यह उत्तर सही है - लेकिन यहां कुछ विडंबना है। ['QFile :: प्रतिलिपि()' के लिए वास्तविक कोड] (https://github.com/radekp/qt/blob/6f5fb0be85b1d7cc9f93b615b5034c882e946301/src/corelib/io/qfile.cpp#L848) में दौड़ की स्थिति है। –

4

सरल पुन: प्रयास मैं के बारे में सोच सकता है:

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

लेकिन यह अभी भी एक वास्तविक समाधान नहीं है के रूप में दौड़ की स्थिति से कुछ चीजें हैं जो निकालने को ब्लॉक नहीं करती हैं।

मैं वर्तमान में आउटपुट के रूप में एक वेब पेज लिखने को संभालने का एक तरीका तलाश रहा हूं लेकिन ऑटो और रीफ्रेश को हटाने और प्रतिलिपि के बीच कभी भी पकड़ने के बिना।

संबंधित मुद्दे