2010-07-01 2 views
7

Можно создать дубликат:
How to check whether 2 DirectoryInfo objects are pointing to the same directory?Почему это сравнение DirectoryInfo не работает?

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 
} 

Хотя отладки, я могу исследовать значения в каждом, и они равны. Так что я предполагаю, что это еще одно побочное недоразумение ... Пожалуйста, кто-то, как я могу сравнить эти две вещи?

+2

Какая причина сравнения объектов DirectoryInfo? Может быть, вы должны сравнить .FullPath? – griZZZly8

+0

Это не те же самые пути. Это какой-то тест Stroop? –

+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 различных объектов, то почему они не равны. Я считаю, что вам нужно сравнить Parths, поэтому используйте приведенный выше код.

+1

Имейте в виду, что те же самые два пути могут иметь различную оболочку => нечувствительное к регистру сравнение (как в комментариях моего ответа). –

1

Потому что он сравнивает эти два экземпляра, а не их значение (две ссылки).

+0

Только с использованием свойств, т. Е. Свойство '.FullName', которое вы сравниваете, а не экземпляр значения? – baron

+4

В этом случае да. Некоторые классы реализуют интерфейс 'IEquatable ' и переопределяют 'Object.Equals (Object)' для операции равенства. 'DirectoryInfo' должен был бы реализовывать' Equals (DirectoryInfo di) {return String.Compare (this.FullName, di.FullName, true) == 0; } 'для того, чтобы вышеприведенный код работал (между прочим). Изменено сравнение, потому что пути могут иметь разные оболочки. –

4

Я сделал поиск Google для «DirectoryInfo равенства» и нашел несколько отличных результатов, в том числе один на StackOverflow (How to check whether 2 DirectoryInfo objects are pointing to the same directory?)

Если два Directory.FullName сек матч, то вы знаете, что они являются то же самое, но если они не совпадают, вы все еще мало что знаете. Есть короткие имена, ссылки и переходы, и по многим другим причинам две разные строки могут ссылаться на одно и то же место на диске.

Если вы считаете, что уверены, что две строки не совпадают с местоположением, а безопасность поставлена ​​на карту, вы, вероятно, создаете ошибку безопасности. Протектор осторожно.

+3

Некоторые способы «обмануть» DirectoryInfo: команда 'subst', команда« net use »или общий сетевой ресурс. –

2

Как говорит Ярослав Jandek (жаль, что я не могу комментировать, не хватает репутации)

Поскольку он сравнивает эти два экземпляры, а не их значения (два референции).

И на самом деле это то же самое для тонны других случаев! Для экс

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

Оба IP-адреса представляют тот же адрес, но у вас есть две различные экземпляры класса IPaddress. Поэтому, конечно, «ip1 == ip2» и «ip1.Equals (ip2)» оба являются ложными, потому что они не указывают на один и тот же объект.

Теперь, если вы отметите «ip1.Address == ip2.Address», результат будет прав как IPAddress.Address «длинный», поэтому вы сравниваете 2 типа значений. Обратите внимание: «ip1.ToString() == ip2.ToString()» также будет истинным, даже если строка является ссылочным типом, а не типом значения (но строки действительно являются специальными).

Так что в вашем случае вы хотите сравнить свойство FullName (это строка, поэтому никаких проблем).

Вы говорите

Является ли это только с помощью свойства, то есть свойство .FullName, что вы сравниваете значение, чем, например?

На самом деле это больше связано с тем, является ли свойство типом значения или ссылочным типом. Кроме того, при сравнении ссылочных типов в большинстве случаев сравнение будет заключаться в том, указывают ли они на один и тот же объект, но можно переопределить методы или создать операторы, чтобы сравнение осуществлялось на контенте объектов (опять же как и Ярослав Яндек уже указал).

HTH

+0

Проблема окончательной косой черты остается. – SerG

+0

@SerG: действительно. Я больше пытался объяснить разницу ByVal против ByRef, чем отвечать на конкретный вопрос (и я тоже не думал об этом случае). – user276648

Смежные вопросы