Pourquoi cette comparaison DirectoryInfo ne fonctionne-t-elle pas?

Dupliquer possible:
Comment vérifier si 2 objects DirectoryInfo pointent sur le même répertoire?

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 } 

Pendant le débogage, je peux examiner les valeurs de chacune d’entre elles et elles sont égales. Donc, je suppose que c’est un autre malentendu byval byref… S’il vous plait, quelqu’un, comment comparer ces deux choses?

Je crois que tu veux faire ça:

 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 ssortingng 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 ssortingng like this (or ssortingp 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, SsortingngComparison.CurrentCultureIgnoreCase) { //this will not be skipped } ............ 

Dans votre exemple, vous comparez 2 objects différents et c’est pourquoi ils ne sont pas égaux. Je crois que vous devez comparer les chemins, utilisez le code ci-dessus.

J’ai effectué une recherche Google sur “l’égalité DirectoryInfo” et trouvé plusieurs excellents résultats, dont un sur StackOverflow ( Comment vérifier si 2 objects DirectoryInfo pointent sur le même répertoire? )

Si deux Directory.FullName correspondent, alors vous savez qu’ils sont identiques, mais s’ils ne correspondent pas, vous n’en savez toujours pas beaucoup. Il existe des noms courts, des liens et des jonctions et bien d’autres raisons pour lesquelles deux chaînes différentes pourraient se référer au même emplacement sur le disque.

Si vous comptez bien savoir que deux chaînes ne sont pas au même emplacement et que la sécurité est en jeu, vous créez probablement un bogue de sécurité. Marchez avec soin.

Comme le dit Jaroslav Jandek (désolé je ne peux pas commenter, pas assez de réputation)

Parce qu’il compare ces deux instances, pas leur valeur (deux références).

Et en fait, c’est la même chose pour des tonnes d’autres cas! Pour ex

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

Les deux adresses IP représentent la même adresse, mais vous avez deux instances distinctes de la classe IPAddress. Bien entendu, “ip1 == ip2” et “ip1.Equals (ip2)” sont tous les deux faux, car ils ne pointent pas vers le même object.

Maintenant, si vous cochez “ip1.Address == ip2.Address”, le résultat sera vrai car IPAddress.Address est “long”. Vous comparez donc 2 types de valeur. Notez que “ip1.ToSsortingng () == ip2.ToSsortingng ()” sera également vrai, même si une chaîne est un type référence, pas un type valeur (mais les chaînes sont vraiment spéciales).

Donc, en effet, dans votre cas, vous souhaitez comparer la propriété FullName (c’est une chaîne, donc pas de problème).

Vous dites

Est-ce uniquement en utilisant les propriétés, c’est-à-dire la propriété .FullName, que vous comparez la valeur plutôt que l’instance?

En réalité, cela dépend davantage du fait que la propriété soit un type de valeur ou un type de référence. De même, lors de la comparaison de types de référence, la comparaison consistera dans la plupart des cas à indiquer s’ils pointent vers le même object, mais il est possible de remplacer des méthodes ou de créer des opérateurs afin que la comparaison soit faite sur le contenu des objects (toujours comme Jaroslav Jandek). déjà souligné).

HTH

Parce qu’il compare ces deux instances, pas leur valeur (deux références).