2013-02-15 47 views
6

CFileDialog कक्षा का उपयोग करके, मैं एक लंबी पथ के साथ निर्देशिका में रखी गई कई फाइलों का चयन करता हूं। यह ठीक है जब मैं केवल एक या दो फाइलों का चयन करता हूं; लेकिन जब मैं एक ही समय में तीन फाइलों का चयन करता हूं तो यह तीसरे फ़ाइल पथ का केवल एक हिस्सा देता है। (ऐसा लगता है कि यह संभवतः 512 अक्षरों तक सीमित है) मैं इसे कैसे हल कर सकता हूं?क्यों CFileDialog :: फ़ाइल पथ लंबा होने पर GetNextPathName काम नहीं करता है?

+0

यह खिड़की के 'MAX_PATH' के साथ क्या करना है? – bames53

+0

इसे डिफ़ॉल्ट रूप से आकार '_MAX_PATH' के बफर का उपयोग करके एमएफसी के साथ करना है। यह अतिसंवेदनशील हो सकता है। –

उत्तर

5

एमएफसी आकार _MAX_PATH के डिफ़ॉल्ट बफर का उपयोग करता है और यही कारण है कि आप उस व्यवहार को देख रहे हैं। CFileDialog::CFileDialog के कार्यान्वयन के लिए dlgfile.cpp पर देखें और आप m_ofn.lpstrFile और m_ofn.nMaxFile सेट किए जा रहे हैं।

यदि आप चाहें तो एक बड़ा बफर निर्दिष्ट कर सकते हैं। DoModal पर कॉल करने से पहले आप OPENFILENAME पर पॉइंटर प्राप्त करने के लिए CFileDialog::m_pOFN सदस्य तक पहुंच सकते हैं कि CFileDialog उस का उपयोग सीधे और अपडेट करेगा या CFileDialog::GetOFN पर कॉल करने के लिए संरचना का संदर्भ प्राप्त करने और उसे अपडेट करने के लिए कॉल करेगा।

किसी भी तरह से आप पाएंगे यह सहायक: http://msdn.microsoft.com/en-US/library/ms646839(v=vs.80).aspx

+1

यदि आप इसके आसपास काम करने की परेशानी से गुज़रने जा रहे हैं, तो आप [सामान्य आइटम संवाद] (http://msdn.microsoft.com/en-US/library/bb776913.aspx) का उपयोग करने पर भी विचार करना चाहेंगे। बजाय। 'GetOpenFileName' API को Vista के रिलीज़ के साथ बहिष्कृत किया गया था, लेकिन अभी भी विरासत अनुप्रयोगों के लिए समर्थित है। –

+0

धन्यवाद। आपका विवरण और लिंक भी मेरे लिए काम करता है। ;) – Javid

0

यह मानते हुए कि अपने कोड इस तरह दिखता है:

CFileDialog dialog(...); 
dialog.DoModal(); 

फ़ाइलों को समर्थन करने के लिए इच्छा की अधिकतम संख्या निर्धारित, उदाहरण के लिए :

#define MAX_FILE_NAMES 256 

DoModal कॉल करने से पहले इस जोड़ें:

CString data; 
dialog.m_pOFN->nMaxFile = (MAX_FILE_NAMES*(MAX_PATH+1))+1; 
dialog.m_pOFN->lpstrFile = data.GetBuffer((MAX_FILE_NAMES*(MAX_PATH+1))+1); 

इस जोड़े DoModal बुला के बाद:

data.ReleaseBuffer();