2009-11-17 11 views
6

Duplicar posible:
Best way to determine if two path reference to same file in C#¿Cuál es la forma correcta de comparar dos nombres de archivos para ver si son el mismo archivo?

Así que tienen dos nombres de archivos de Windows que tengo que comparar para determinar si son lo mismo. Uno que el usuario me dio, uno que me dio otro programa. Entonces, ¿cómo debería compararía:

 
C:\Program Files\Application1\APP.EXE 
C:\Progra~1\Applic~1\APP.EXE 
C:\program files\applic~1\app.exe 

Me parece que no puede encontrar una manera consistente 'normalizar' el camino, he intentado utilizar Path.GetFullPath (ruta) y el nuevo FileInfo (ruta) y .FullName ninguno parece resolver esto.

ACTUALIZACIÓN:

Path.GetFullPath (ruta) corregirá el corto a la conversión de nombre largo pero no se normalizará caso. Por lo tanto, se requiere un StringComparer.OrdinalIgnoreCase.Equals (path1, path2).

Respuesta

3

Necesitará Path.GetFullPath() + comparación de cadena insensible a mayúsculas y minúsculas.

Ejecutar el siguiente código:

using System; 
using System.IO; 

class Test { 
static void Main() 
{ 
    //string [] str = new string[] {@"c:\program files\vim\vim72", @"c:\progra~1\vim\vim72"}; 
    string [] str = new string[] {@"c:\program files\Refere~1\microsoft", @"c:\progra~1\Refere~1\microsoft"}; 
    foreach (string s in str) { 
    // Call s = Environment.ExpandEnvironmentVariables (s) if needed. 
    Console.WriteLine (Path.GetFullPath (s)); 
    } 
} 
} 

da:

c:\program files\Reference Assemblies\microsoft 
c:\Program Files\Reference Assemblies\microsoft 
+0

Borrar esto rápido, antes de que te golpeen en el downvote ... –

+0

Me funciona aquí. Intenté c: \ Progra ~ 1 \ Refere ~ 1 \ Microsoft yc: \ Program Files \ Referenced Assemblies \ microsoft ... – Gonzalo

+0

Aparentemente lo intentó. Publiqué lo mismo y obtuve 3 votos indirectos al instante. –

0

una breve prueba de funcionamiento dice que el código de abajo va a trabajar para las rutas proporcionadas:

bool CompareFileName(string file1, string file2) 
     { 
      var directory1 = Path.GetDirectoryName(file1); 
      var directory2 = Path.GetDirectoryName(file2); 
      var fileName1 = Path.GetFileName(file1); 
      var fileName2 = Path.GetFileName(file2); 

      return directory1.Equals(directory2, StringComparison.InvariantCultureIgnoreCase) && 
        fileName1.Equals(fileName2, StringComparison.InvariantCultureIgnoreCase); 
     } 

esto supone plataforma de Windows (una suposición hecha debido a las rutas céntricas de Windows dadas como rutas de ejemplo)

0

Uso el objeto FileInfo. Si crea un objeto fileinfo de un archivo que realmente existe, la propiedad Directorio le da un nombre de ruta con un formato agradable.

También obtiene la ventaja adicional de poder probar si el archivo existe realmente.

Cuestiones relacionadas