Почему это сравнение DirectoryInfo не работает? [дубликат]

7
задан Community 23 May 2017 в 12:22
поделиться

4 ответа

Я считаю, что вы хотите это сделать:

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

9
ответ дан 6 December 2019 в 11:45
поделиться

Как говорит Ярослав Яндек (извините, что не могу комментировать, недостаточно репутации)

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

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

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 является "long", поэтому вы сравниваете два типа значений. Обратите внимание, что "ip1.ToString() == ip2.ToString()" также будет истинным, даже если строка - это ссылочный тип, а не тип значения (но строки - это действительно специальные типы).

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

Вы говорите, что

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

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

HTH

2
ответ дан 6 December 2019 в 11:45
поделиться

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

1
ответ дан 6 December 2019 в 11:45
поделиться

Я выполнил поиск в Google по запросу "равенство DirectoryInfo" и нашел несколько отличных результатов, в том числе один на StackOverflow ( Как проверить, указывают ли 2 объекта DirectoryInfo на один и тот же каталог? ])

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

Если вы рассчитываете точно знать, что две строки не находятся в одном и том же месте и безопасность находится под угрозой, вы, вероятно, создаете ошибку безопасности. Действуйте осторожно.

5
ответ дан 6 December 2019 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: