2013-06-03 6 views
6

डेल्फी: कैसे 255 से अधिक अक्षर पथ नीचे recurse और पढ़ने के लिए फ़ाइल गुण255 वर्णों से अधिक पथों को कैसे रिकर्स करें और फ़ाइल विशेषताओं को पढ़ें?

मैं एक सांत्वना अनुप्रयोग लेखन और 255 अक्षरों से अधिक रास्तों के साथ एक निर्देशिका संरचना पार और फिर उन्हें भीतर फ़ाइलों की विशेषताओं को पढ़ने की जरूरत है कर रहा हूँ।

ऐतिहासिक रूप से, मैंने 2006 से टर्बो डेल्फी का उपयोग करके रिकर्सन और फाइंड फर्स्ट का उपयोग किया लेकिन ऐसा लगता है कि यह 255 वर्णों से अधिक पथों पर छोड़ देता है।

क्या मैं कुछ और के लिए FindFirst() फ़ंक्शन को स्वैप कर सकता हूं? या मुझे एक अलग दृष्टिकोण लेना है?

+1

यह एक डुप्लिकेट है [डेल्फी - यह जांचने के लिए कि 255 वर्णों से अधिक फ़ाइल मौजूद है या नहीं) (http://stackoverflow.com/q/16874118/62576), सिवाय इसके कि यह गुणों के बजाय 'FileExists' के बारे में पूछ रहा है । मूल प्रश्न और इसका उत्तर वही है, हालांकि। –

+0

@ केनहाइट यह सवाल वास्तव में विशेषताओं के बारे में नहीं है। उन्हें 'WIN32_FIND_DATAW' संरचना से ठीक से पढ़ा जाता है। मुद्दा पूरी तरह से 'FindFirstFile' पर कॉल है जिसे 260 चार सीमा से मुक्त करने की आवश्यकता है। –

+1

@ डेविड: जिनमें से सभी पिछले प्रश्न के उत्तर में भी शामिल हैं, जिसमें 'नामकरण फ़ाइलें' लिंक और ए/डब्ल्यू संस्करणों का उल्लेख शामिल है। यह किस तरह से अलग है? –

उत्तर

8

यदि आप \\?\ के साथ फ़ाइल नाम उपसर्ग करते हैं तो आप विस्तारित-लंबाई पथ पार्सिंग सक्षम करते हैं और इसलिए 260 वर्ण पथ लंबाई सीमा से बचते हैं।

इस उपसर्ग के काम के लिए आपको Win32 API फ़ंक्शंस के यूनिकोड संस्करणों को कॉल करने की आवश्यकता है। तो यदि आप यूनिकोड डेल्फी का उपयोग कर रहे थे तो यह सब आपको करने की ज़रूरत है। लेकिन चूंकि आप प्री-यूनिकोड डेल्फी का उपयोग कर रहे हैं, इसलिए आपको FindFirst का अपना संस्करण रोल करना होगा जो API कार्यों के यूनिकोड संस्करणों को कॉल करता है। आप FindFirstFileW, FindNextFileW, FindClose पर कॉल कर रहे हैं और संरचना के यूनिकोड संस्करण का उपयोग कर रहे हैं, WIN32_FIND_DATAW

एमएसडीएन: Naming Files, Paths, and Namespaces पर इन मुद्दों पर बड़ी लंबाई में चर्चा की गई है।

अपने विशेष परिदृश्य में, FindFirstFileW के लिए दस्तावेज़ इस तरह बाहर मुद्दा कॉल:

इस समारोह के एएनएसआई संस्करण में, नाम MAX_PATH अक्षरों तक सीमित है। इस सीमा को 32,767 चौड़े वर्णों तक विस्तारित करने के लिए, फ़ंक्शन के यूनिकोड संस्करण को कॉल करें और पथ पर "\? \" को प्रीपेड करें।

ध्यान दें कि WIN32_FIND_DATAW में दो फ़ाइल नाम फ़ील्ड 260 वर्णों तक सीमित हैं। यह ठीक है क्योंकि उनमें केवल नाम का सापेक्ष हिस्सा होता है, जो कि युक्त निर्देशिका के सापेक्ष ऑब्जेक्ट नाम है। जब आप FindFirstFileW पर कॉल करते हैं तो आपको केवल \\?\ उपसर्ग का उपयोग करने की आवश्यकता है।

आदेश में इस एपीआई के यूनिकोड संस्करण का उपयोग करने के लिए आप FindFirstFileW की lpFileName पैरामीटर के लिए कोई WideString का उपयोग करें और PWideChar(FileName) का उपयोग कर इसे पारित देगी।

var 
    FileName: WideString; 
.... 
// initialise FileName, this will happen in your recursion 
FindHandle := FindFirstFileW(PWideChar(FileName), FindData); 

फ़ाइल विशेषताओं का सवाल है, वे एक यात्रा पर WIN32_FIND_DATAW struct से बाहर पढ़ा जा सकता है। आपके कोड के उस हिस्से को बदलने की जरूरत नहीं है। केवल एक चीज जिसे आपको ठीक करने की आवश्यकता है, प्रारंभिक कॉल पर FindFirstFileW पर> 260 चार पार्सिंग प्राप्त करना है। बाकी सब कुछ सामान्य रूप से बहती है।

+0

जैसा कि मैंने इसे पढ़ा है, यह या तो यूनिकोड फ़ंक्शंस के आसपास डेल्फी के पुराने संस्करणों के लिए या एक नया "यूनिकोड" संस्करण का उपयोग करके अपना स्वयं का फ़ंक्शन लपेटने का सवाल है। अगर मैंने उत्तरार्द्ध किया और बस उस काम को फिर से तैयार किया? – Tal

+0

यदि आपने यूनिकोड डेल्फी में पुन: संकलित किया है, और जादू उपसर्ग जोड़ा है, तो आपको वह परिणाम मिलेंगे जिन्हें आप ढूंढ रहे हैं। ऐसा इसलिए है क्योंकि 'FindFirst' आपके' पथ' पैरामीटर को 'FindFirstFile' पर भेजता है, और आपको यूनिकोड डेल्फी में यूनिकोड संस्करण मिलता है। –

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