2010-07-01 12 views
7

Duplicar posibles:
How to check whether 2 DirectoryInfo objects are pointing to the same directory?¿Por qué no funciona esta comparación de 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 
} 

Mientras que la depuración, que puede examinar los valores de cada uno y que son iguales. Así que supongo que este es otro byval por malentendido ... Por favor, alguien, ¿cómo puedo comparar estas dos cosas?

+2

¿Qué razón de comparar objetos DirectoryInfo? Tal vez deberías comparar .FullPath? – griZZZly8

+0

Esos no son los mismos caminos. ¿Es esto algún tipo de prueba de Stroop? –

+2

Además, sus paréntesis están comentados. Si quieres que pongamos energía para ayudarte, ¿no pondrás energía para hacer una buena pregunta? –

Respuesta

9

Creo que usted quiere hacer esto:

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 
} 

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

En que se están comparando ejemplo 2 objetos diferentes por eso es que no son iguales. Creo que debes comparar Parths así que utiliza el código de arriba.

+1

Tenga en cuenta que las mismas dos rutas pueden tener diferentes casing => caso de comparación insensible se debe utilizar (como en los comentarios de mi respuesta). –

1

Porque compara esas dos instancias, no su valor (dos referencias).

+0

¿Es solo mediante el uso de las propiedades, es decir, la propiedad '.FullName', que está comparando el valor en lugar de la instancia? – baron

+4

En este caso, sí. Algunas clases implementan la interfaz 'IEquatable ' y reemplazan 'Object.Equals (Object)' para la operación de igualdad. El 'DirectoryInfo' tendría que haber implementado' Equals (DirectoryInfo di) {return String.Compare (this.FullName, di.FullName, true) == 0; } 'para que funcione el código anterior (entre otras cosas). Se modificó la comparación porque las rutas pueden tener una carcasa diferente. –

4

lo hice una búsqueda en Google de "igualdad DirectoryInfo" y hallaron varios grandes resultados, incluyendo uno en StackOverflow (How to check whether 2 DirectoryInfo objects are pointing to the same directory?)

Si ambas coinciden Directory.FullName s, entonces usted sabe que son la misma, pero si no coinciden, todavía no sabes mucho. Hay nombres cortos y enlaces y uniones, y muchas otras razones por las que dos cadenas diferentes podrían referirse a la misma ubicación en el disco.

Si cuenta con la certeza de que dos cadenas no son la misma ubicación, y la seguridad está en juego, es probable que esté creando un error de seguridad. Ve con cuidado.

+3

Algunas formas de "engañar" a DirectoryInfo: el comando 'subst', el comando' net use' o el recurso compartido de red. –

2

Como dice Jaroslav Jandek (lo siento, no puedo hacer ningún comentario, no es suficiente la reputación)

Debido a que compara los dos casos, no su valor (dos referencias).

¡Y de hecho es lo mismo para toneladas de otros casos! Para ex

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

aborda Tanto IP representar la misma dirección, pero hay que dos instancias distintas de la clase de dirección IP. Así que, por supuesto, "ip1 == ip2" e "ip1.Equals (ip2)" son ambos falsos, porque no apuntan al mismo objeto.

Ahora, si marca "ip1.Address == ip2.Address", el resultado será verdadero ya que IPAddress.Address es "larga", por lo que está comparando 2 tipos de valores. Tenga en cuenta que "ip1.ToString() == ip2.ToString()" también será verdadero, incluso si una cadena es un tipo de referencia, no un tipo de valor (pero las cadenas son realmente especiales).

De hecho, en su caso, desea comparar la propiedad FullName (es una cadena, por lo que no hay problema).

Usted dice

¿Es sólo mediante el uso de las propiedades, es decir, la propiedad .FullName de que está comparando el valor en lugar de ejemplo?

En realidad, tiene más que ver con si la propiedad es un tipo de valor o un tipo de referencia. Además, al comparar los tipos de referencia, en la mayoría de los casos la comparación será si apuntan al mismo objeto, pero es posible anular los métodos o crear operadores para que la comparación se realice en el contenido de los objetos (una vez más como Jaroslav Jandek ya lo señaló).

HTH

+0

El problema de la barra final aún permanece. – SerG

+0

@SerG: de hecho. Estaba tratando de explicar la diferencia ByVal vs ByRef que responder la pregunta específica (y tampoco pensé en ese caso). – user276648

Cuestiones relacionadas