2010-07-01 13 views
7

संभव डुप्लिकेट:
How to check whether 2 DirectoryInfo objects are pointing to the same directory?यह निर्देशिकाइन्फो तुलना क्यों काम नहीं कर रही है?

var dirUserSelected = new DirectoryInfo(Path.GetDirectoryName("SOME PATH")); 
var dirWorkingFolder = new DirectoryInfo(Path.GetDirectoryName("SAME PATH AS ABOVE")); 

if (dirUserSelected == dirWorkingFolder) 
{ 
    //this is skipped 
} 

if (dirUserSelected.Equals(dirWorkingFolder)) 
{ 
    //this is skipped 
} 

डिबगिंग के दौरान, मैं प्रत्येक में मूल्यों की जांच कर सकते हैं और वे बराबर हैं। तो मुझे लगता है कि यह एक और बीमार Byref गलतफहमी है ... कृपया कोई, मैं इन दो चीजों की तुलना कैसे करूं?

+2

DirectoryInfo ऑब्जेक्ट की तुलना करने का क्या कारण है? शायद आपको तुलना करना चाहिए। फुलपाथ? – griZZZly8

+0

वे एक ही पथ नहीं हैं। क्या यह किसी प्रकार का स्ट्रूप परीक्षण है? –

+2

इसके अलावा, आपके करीबी ब्रेसिज़ पर टिप्पणी की जाती है। यदि आप चाहते हैं कि हम आपकी मदद करने के लिए ऊर्जा डालें, तो क्या आप एक अच्छा सवाल पूछने के लिए ऊर्जा नहीं लगाएंगे? –

उत्तर

9

मेरा मानना ​​है कि आप ऐसा करना चाहते हैं:

var dirUserSelected = new DirectoryInfo(Path.GetDirectoryName(@"c:\some\path\")); 
var dirWorkingFolder = new DirectoryInfo(Path.GetDirectoryName(@"c:\Some\PATH")); 

if (dirUserSelected.FullName == dirWorkingFolder.FullName) 
{ // this will be skipped, 
    // since the first string contains an ending "\" and the other doesn't 
    // and the casing in the second differs from the first 
} 

// to be sure all things are equal; 
// either build string like this (or strip last char if its a separator) 
// and compare without considering casing (or ToLower when constructing) 
var strA = Path.Combine(dirUserSelected.Parent, dirUserSelected.Name); 
var strB = Path.Combine(dirWorkingFolder.Parent, dirWorkingFolder.Name); 
if (strA.Equals(strB, StringComparison.CurrentCultureIgnoreCase) 
{ //this will not be skipped 
} 

............ 

आप उदाहरण में आप 2 अलग-अलग वस्तुओं की तुलना कर रहे Thats क्यों वे बराबर नहीं हैं। मेरा मानना ​​है कि आपको पार्थ की तुलना करने की आवश्यकता है ताकि ऊपर दिए गए कोड का उपयोग करें।

+1

ध्यान रखें कि एक ही दो पथों में अलग-अलग आवरण हो सकते हैं => केस असंवेदनशील तुलना का उपयोग किया जाना चाहिए (जैसा कि मेरे उत्तर की टिप्पणियों में है)। –

1

क्योंकि यह उन दो उदाहरणों की तुलना करता है, न कि उनके मूल्य (दो संदर्भ)।

+0

क्या यह केवल गुणों का उपयोग करके है, यानी 'फुलनाम' संपत्ति है जिसे आप उदाहरण के बजाय मूल्य की तुलना कर रहे हैं? – baron

+4

इस मामले में, हाँ। कुछ वर्ग 'IEquatable ' इंटरफ़ेस को कार्यान्वित करते हैं और समानता संचालन के लिए 'ऑब्जेक्ट। एक्वाल्स (ऑब्जेक्ट)' ओवरराइड करते हैं। 'DirectoryInfo' को 'बराबर (DirectoryInfo di) {रिटर्न स्ट्रिंग। कॉम्पेयर (यह। पूर्ण नाम, di.FullName, true) == 0 लागू करना होगा; } 'उपरोक्त कोड के लिए काम करने के लिए (अन्य चीजों के साथ)। तुलना बदल दी क्योंकि पथ अलग आवरण हो सकता है। –

4

मैं के लिए "DirectoryInfo समानता" एक गूगल खोज किया था और StackOverflow पर सहित कई अन्य महान परिणाम में पाया गया (How to check whether 2 DirectoryInfo objects are pointing to the same directory?)

तो दो Directory.FullName रों मैच है, तो आप जानते हैं कि वे ही कर रहे हैं, लेकिन अगर वे मेल मत करो, आप अभी भी ज्यादा नहीं जानते हैं। छोटे नाम और लिंक और जंक्शन हैं और कई अन्य कारण डिस्क पर एक ही स्थान पर दो अलग-अलग तारों का उल्लेख किया जा सकता है।

यदि आप यह सुनिश्चित करने के लिए भरोसा करते हैं कि दो तार एक ही स्थान नहीं हैं, और सुरक्षा हिस्सेदारी पर है, तो आप संभावित रूप से सुरक्षा बग बना रहे हैं। सावधानी से चलना।

+3

DirectoryInfo "मूर्ख" करने के कुछ तरीके: 'subst' कमांड,' नेट उपयोग 'कमांड या नेटवर्क शेयर। –

2

जारोस्लाव जांडेक कहते हैं (खेद मैं टिप्पणी नहीं कर सकते हैं, पर्याप्त नहीं प्रतिष्ठा)

क्योंकि यह उन दो उदाहरणों तुलना, नहीं उनके मूल्य (दो संदर्भ)।

और वास्तव में यह अन्य मामलों की टन के लिए एक ही है! पूर्व

IPAddress ip1 = IPAddress.Parse("192.168.0.1"); 
IPAddress ip2 = IPAddress.Parse("192.168.0.1"); 

दोनों आईपी पतों के लिए एक ही पते का प्रतिनिधित्व करते हैं, लेकिन आप दो अलग-अलग उदाहरणों IPAddress वर्ग के है। तो निश्चित रूप से "ip1 == ip2" और "ip1.Equals (ip2)" दोनों झूठे हैं, क्योंकि वे एक ही ऑब्जेक्ट को इंगित नहीं करते हैं।

अब यदि आप "ip1.Address == ip2.Address" जांचते हैं तो परिणाम आईपीएड्रेस के रूप में सच होगा। एड्रेस एक "लंबा" है, इसलिए आप 2 मान प्रकारों की तुलना कर रहे हैं। ध्यान दें कि "ip1.ToString() == ip2.ToString()" भी सही होगा भले ही एक स्ट्रिंग संदर्भ प्रकार न हो, एक मान प्रकार नहीं है (लेकिन तार वास्तव में विशेष हैं)।

तो वास्तव में आपके मामले में आप पूर्णनाम संपत्ति की तुलना करना चाहते हैं (यह एक स्ट्रिंग है इसलिए कोई समस्या नहीं है)।

आप केवल गुण है, यानी .FullName संपत्ति है कि आप उदाहरण के बजाय मूल्य की तुलना कर रहे का उपयोग करके कहते हैं कि

यह है?

वास्तव में यह संपत्ति के मूल्य या संदर्भ प्रकार के साथ क्या करना है इसके साथ अधिक कुछ करना है। संदर्भ प्रकारों की तुलना करते समय, अधिकांश मामलों में तुलना यह होगी कि वे एक ही वस्तु को इंगित करते हैं या नहीं, लेकिन विधियों को ओवरराइड करना या ऑपरेटरों को बनाना संभव है ताकि तुलना सामग्री ऑब्जेक्ट्स की तुलना में की जा सके (फिर से जारोस्लाव जांडेक ने पहले से ही बताया)।

एचटीएच

+0

अंतिम स्लैश की समस्या अभी भी बनी हुई है। – SerG

+0

@ सेरग: वास्तव में। मैं विशिष्ट प्रश्न का उत्तर देने के बजाय बायवेल बनाम बायफ अंतर को समझाने की कोशिश कर रहा था (और मैंने उस मामले को भी नहीं सोचा था)। – user276648

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