यदि आप \\?\
के साथ फ़ाइल नाम उपसर्ग करते हैं तो आप विस्तारित-लंबाई पथ पार्सिंग सक्षम करते हैं और इसलिए 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 चार पार्सिंग प्राप्त करना है। बाकी सब कुछ सामान्य रूप से बहती है।
यह एक डुप्लिकेट है [डेल्फी - यह जांचने के लिए कि 255 वर्णों से अधिक फ़ाइल मौजूद है या नहीं) (http://stackoverflow.com/q/16874118/62576), सिवाय इसके कि यह गुणों के बजाय 'FileExists' के बारे में पूछ रहा है । मूल प्रश्न और इसका उत्तर वही है, हालांकि। –
@ केनहाइट यह सवाल वास्तव में विशेषताओं के बारे में नहीं है। उन्हें 'WIN32_FIND_DATAW' संरचना से ठीक से पढ़ा जाता है। मुद्दा पूरी तरह से 'FindFirstFile' पर कॉल है जिसे 260 चार सीमा से मुक्त करने की आवश्यकता है। –
@ डेविड: जिनमें से सभी पिछले प्रश्न के उत्तर में भी शामिल हैं, जिसमें 'नामकरण फ़ाइलें' लिंक और ए/डब्ल्यू संस्करणों का उल्लेख शामिल है। यह किस तरह से अलग है? –