2012-09-06 7 views
6

मैं C++ stdio.h केनाम बदलें() रिटर्न -1। कैसे पता चलेगा कि नाम क्यों विफल रहता है?

int rename (const char * oldname, const char * newname); 

नाम बदलने() फ़ंक्शन का उपयोग कर रहा एक फ़ोल्डर का नाम बदलने के लिए लेकिन कभी-कभी यह फ़ोल्डर और रिटर्न -1 नाम बदलने के लिए विफल रहता है।

क्या यह जानने का कोई तरीका है कि नाम बदलें() विफल क्यों है?
किसी भी C++ फ़ंक्शन के माध्यम से इस त्रुटि स्पष्टीकरण को जानने का कोई भी तरीका।

+6

'errno' चर की जाँच करें। उदाहरण का प्रयोग करें ['strerror'] (http://msdn.microsoft.com/en-us/library/zc53h9bh%28v=vs.80%29.aspx) प्रिंट करने योग्य स्ट्रिंग प्राप्त करने के लिए। –

उत्तर

9

यह errno.h

#include <errno.h> 
#include <string.h> 
... 
if(rename("old","new") == -1) 
{ 
    std::cout << "Error: " << strerror(errno) << std::endl; 
} 

से ठोस त्रुटि प्राप्त करने के लिए संभव हो जाना चाहिए लौटे त्रुटियों शायद ओएस-अलग होते हैं। http://linux.die.net/man/3/rename दिखाता है कि लिनक्स का उपयोग करते समय आप आम तौर पर क्या प्राप्त कर सकते हैं।

2

rename अंतिम त्रुटि संख्या के साथ _errno वैश्विक चर सेट करेगा, इसे जांचें।

+2

ध्यान दें कि अंडरस्कोर कुछ अजीब माइक्रोसॉफ्टवाद है। मानक सी ++ में, इसे 'errno' कहा जाता है। –

2

_errno का मान देखें। यह इन में से एक हो सकते हैं:

EACCES: File or directory specified by newname already exists or could not be created (invalid path); or oldname is a directory and newname specifies a different path. 
ENOENT: File or path specified by oldname not found. 
EINVAL: Name contains invalid characters. 
3

इस तरह सी एपीआई कार्यों को आम तौर पर errno सेट जब वे अधिक जानकारी देने के लिए असफल। दस्तावेज़ आमतौर पर आपको errno मानों को सेट कर सकता है, और strerror() नामक एक फ़ंक्शन भी है जो errno मान लेगा और आपको char * पर मानव-पठनीय त्रुटि संदेश के साथ वापस देगा।

आपको उस तक पहुंचने के लिए <errno.h> शामिल करने की आवश्यकता हो सकती है।

MFC में rename() के संबंध में

, इस इसके लिए प्रलेखन होने लगते हैं: http://msdn.microsoft.com/en-us/library/zw5t957f(v=vs.100).aspx जो कहते हैं कि यह सेट errnoEACCES, ENOENT या विभिन्न परिस्थितियों में EINVAL, तो उन के खिलाफ जांच यह पता लगाने की क्या संदर्भ में, चल रहा है विनिर्देशों के लिए प्रलेखन के लिए।

-2

यदि फ़ाइल खुलती है, तो कृपया नाम बदलने से पहले इसे बंद करें। नीचे दिया गया कोड काम नहीं करेगा और फ़ाइल का नाम बदला नहीं जा सकता है।

ofstream _file("C:\\yourfile.txt", ofstream::app); 

if (-1 == rename("C:\\yourfile.txt", "C:\\yourfile2.txt")) 
    puts("The file doesn't exist or already deleted"); 

_file.close(); 
+1

दो साल के पुराने प्रश्न का उत्तर क्यों दें, जिनके पास पहले से ही एक स्वीकार्य उत्तर है और आपका उत्तर मूल समस्या के लिए पूरी तरह से अप्रासंगिक है। –

0

आप बस gdb में जबकि नाम बदलने के लिए सिर्फ घातक कॉल के बाद त्रुटि की स्ट्रिंग प्रतिनिधित्व प्रदर्शित कर सकते हैं आप लिनक्स पर कर रहे हैं:

211    if (rename(f_z_name, y) == -1) { 
(gdb) n 
212     err = RM_ERR_RENAME_TMP_Y; 
(gdb) p errno 
$6 = 18 
(gdb) p strerr(errno) 
No symbol "strerr" in current context. 
(gdb) p strerror(errno) 
$7 = 0x7ffff7977aa2 "Invalid cross-device link" 
(gdb) 
संबंधित मुद्दे