सी

2010-12-22 4 views
7

में फ़ाइल का नाम बदलने के लिए Win32 API यदि स्रोत निर्देशिका और लक्ष्य निर्देशिका, MoveFile वास्तव में स्रोत फ़ाइल की एक प्रतिलिपि लक्ष्य फ़ाइल में बनायेगी, जिसका अर्थ है कि मैं दो फाइलों को देखकर समाप्त कर दूंगा।सी

क्या यह नाम का सबसे अच्छा तरीका हासिल किया जा सकता है?

+0

stdio.h में नाम बदलने का प्रयास करें? – vcsjones

+1

आपका क्या मतलब है? 'MOVEFILE_COPY_ALLOWED' के साथ 'MoveFileEx' आपको दो फाइल नहीं देगा - यह दो फाइलें अलग-अलग वॉल्यूम पर हैं, तो यह CopyFile को तब DeleteFile कहते हैं। – wj32

+0

मुझे लगता है कि मैंने ऐसे उदाहरण देखे हैं जहां MoveFile() CopyFile() + DeleteFile() करेगा, लेकिन स्रोत फ़ाइल अभी भी किसी के द्वारा बंद कर दी गई है, इसलिए स्थिति लंबित हटाने के लिए सेट की जाएगी; तब जब यह अनलॉक हो जाता है तो यह जादुई रूप से गायब हो जाता है। या शायद मैं इसे बना रहा हूँ; याद नहीं कर सकता – Luke

उत्तर

1

आपका कोड कैसा दिखता है? मेरे पास यह है:

if(MoveFile(_T("c:\\hold\\source"),_T("c:\\hold\\dest"))) 
{ 
    printf("succeeded\n"); 
}else 
{ 
    printf("Error %d\n",GetLastError()); 
} 

और यह स्रोत को पीछे नहीं छोड़ता है।

1

आप MoveFileEx() API का उपयोग करके MOVEFILE_COPY_ALLOWED निर्दिष्ट किए बिना यह देखने के लिए प्रयास कर सकते हैं कि यह वह प्रश्न प्रदान करता है जिसे आप ढूंढ रहे हैं।

+0

MOVEFILE_COPY_ALLOWED निर्दिष्ट नहीं है इसका मतलब है कि क्रॉस-वॉल्यूम चाल विफल हो जाएंगी। यही वह नहीं है जो ओपी चाहता है। "कॉपी/डिलीट द्वारा अनुकरण" इस तथ्य को संदर्भित करता है कि क्रॉस-वॉल्यूम चालों को डिस्क मेटा डेटा को फिर से लिखकर निष्पादित नहीं किया जा सकता है जैसा कि समान वॉल्यूम चाल के लिए किया जाता है। –

+0

@ डेविड: मैंने सोचा था कि ओपी एक नामकरण ऑपरेशन के लिए पूछ रहा था, जो केवल एक सफल/प्रतिलिपि सिम्युलेशन का नाम बदलने के बजाय फ़ाइल मेटाडेटा को बदलकर किया जा सकता है (मुझे लगता है कि सवाल मेरे लिए थोड़ा अस्पष्ट है)। –

+0

ठीक होने के लिए, सवाल बहुत खराब तरीके से सामने आया है, जैसा कि अक्सर होता है, कोई केवल अनुमान लगा सकता है कि इरादा क्या था। शायद आपकी व्याख्या सही है! –

8

MoveFile फ़ंक्शन वास्तव में आप जो चाहते हैं वह है। प्रलेखन से:

MoveFile समारोह या तो एक ही निर्देशिका में या निर्देशिका के पार चले जाएँगे (नाम बदलने) या तो एक फ़ाइल या (इसके बच्चों सहित) एक निर्देशिका।

यदि स्रोत और गंतव्य स्थान दोनों एक ही वॉल्यूम पर हैं, तो एक परमाणु नामांकन ऑपरेशन किया जाता है। यदि वे अलग-अलग वॉल्यूम पर हैं, तो इसके बजाय एक कॉपी/डिलीट ऑपरेशन किया जाता है (यह सबसे अच्छा है जो आप कर सकते हैं)।

+1

डिफ़ॉल्ट रूप से 'MoveFileEx' केवल चाल चलता है, यह ** ** कॉपी नहीं करेगा ** जब तक आप' MOVEFILE_COPY_ALLOWED' ध्वज पास नहीं करते। – unixman83

4

#include <stdio.h> 

int Result = rename(oldname , newname); 

if (Result) 
    // "Error occurred."); 
else 
    // "File was successfully renamed!";