2009-01-04 15 views
13

क्या किसी को पता है कि केस-असंवेदनशील फ़ाइलों के नाम से निपटने के दौरान Win32 का उपयोग किस संस्कृति सेटिंग्स का उपयोग करता है?Win32 फ़ाइल का नाम तुलना

क्या यह ऐसा कुछ है जो उपयोगकर्ता की संस्कृति के आधार पर भिन्न होता है, या ऐसे आवरण नियम हैं जो Win32 संस्कृति invariant का उपयोग करता है?

उत्तर

6

अनुमानित उत्तर Comparing Unicode file names the right way पर है।

असल में, सिफारिश (CharUpper, CharUpperBuff, या LCMapString का प्रयोग करके) दोनों तार को अपरकेस में है, तो एक बाइनरी तुलना का उपयोग कर की तुलना (, एक अपरिवर्तनीय स्थान के साथ नहीं CompareString अर्थात memcmp या wmemcmp) है। फ़ाइल सिस्टम यूनिकोड सामान्यीकरण नहीं करता है, और केस नियम लोकेल सेटिंग्स पर निर्भर नहीं हैं।

यूनिकोड के विभिन्न संस्करणों में जिनके आवरण नियम बदल गए हैं, उनके साथ व्यवहार करते समय दुर्भाग्यपूर्ण संदिग्ध मामले हैं, लेकिन यह उतना ही अच्छा है जितना आप कर सकते हैं।

6

Comparing file names in native code और Don't compare filenames इस विषय पर कुछ अच्छे ब्लॉग पोस्ट हैं। पहले ऑर्डिनल इग्नोर कैस कॉम्पैयरस्ट्रिंग्स के लिए सी/सी ++ कोड है, और दूसरा आपको बताता है कि यह हमेशा फ़ाइल नामों के लिए कैसे काम नहीं करता है और इसे कम करने के लिए क्या करना है।

फिर यूनिकोड समस्याएं हैं। जबकि इन नए OrdinalIgnoreCase स्ट्रिंग तुलना एल्गोरिदम आपके स्थानीय एनटीएफएस ड्राइव के लिए बहुत अच्छे हैं, लेकिन हो सकता है कि वे आपके एफएटी ड्राइव या नेटवर्क शेयर पर सही उत्तर न दें।

तो जवाब क्या है? जब संभव हो, तो फाइल सिस्टम आपको बताए। CreateFile आपको बता सकता है कि दिया गया फ़ाइल नाम मौजूद है या नहीं। बस सही निर्माण स्वभाव चुनें। यदि आपको हैंडल की तुलना करने की आवश्यकता है, तो आप अक्सर GetFileInformationByHandle का उपयोग कर सकते हैं; dwVolumeSerialNumber/nFileIndexHigh/nFileIndexLow पर देखें।

4

आप नेट उपयोग कर रहे हैं, माइक्रोसॉफ्ट की ओर से आधिकारिक सिफारिश (जो बाद में Ordinal तुलना का उपयोग कर तुलना करने के लिए) सामान्य के लिए तुलना के लिए StringComparison.OrdinalIgnoreCase और ToUpperInvariant उपयोग करने के लिए है। यह रजिस्ट्री कुंजियों और मानों, पर्यावरण चर आदि पर भी लागू होता है

अधिक जानकारी के लिए New Recommendations for Using Strings in Microsoft .NET 2.0 देखें।

ध्यान दें कि यह एनटीएफएस पर भरोसेमंद है, लेकिन यह नेटवर्क शेयरों के साथ असफल हो सकता है, उदाहरण के लिए। समाधान के लिए अपने पोस्ट में @ स्टीवस्टिनर का उत्तर और लिंक देखें।

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