85 votes

Comment comparer les chemins (répertoires) en C #?

Si j'ai deux DirectoryInfo objets, comment puis-je comparer sémantique pour l'égalité? Par exemple, les chemins d'accès suivants doivent être pris en considération égale à C:\temp:

  • C:\temp
  • C:\temp\
  • C:\temp\.
  • C:\temp\x\..\..\temp\.

Le suivant peut ou peut ne pas être égale à C:\temp:

  • \temp si le répertoire de travail actuel est sur le lecteur C:\
  • temp si le répertoire de travail actuel est - C:\
  • C:\temp.
  • C:\temp...\

Si il est important de considérer le répertoire de travail actuel, je peux le faire moi-même, ce qui n'est pas si important que cela. De fuite les points sont supprimés dans windows, de sorte que ces chemins ne devrait vraiment être égal, mais ils ne sont pas dépouillés dans unix, donc en vertu de mono je m'attends à d'autres résultats.

La casse est facultatif. Les chemins d'accès peuvent ou peuvent ne pas exister, et l'utilisateur peut ou peut ne pas avoir les autorisations pour le chemin - je préfère un rapide méthode robuste qui ne nécessite pas d'I/O (donc, pas de vérification de l'autorisation), mais si il y a quelque chose de construit-dans je serais heureux avec tout ce qui est "assez bon" trop...

101voto

VladV Points 5071

GetFullPath semble faire le travail, sauf en cas de différence de casse (Path.GetFullPath ("test")! = = Path.GetFullPath ("TEST")) et un slash de fin. Donc, le code suivant devrait fonctionner correctement:

 String.Compare(
    Path.GetFullPath(path1).TrimEnd('\\'),
    Path.GetFullPath(path2).TrimEnd('\\'), 
    StringComparison.InvariantCultureIgnoreCase)
 

Ou, si vous voulez commencer avec DirectoryInfo:

 String.Compare(
    dirinfo1.FullName.TrimEnd('\\'),
    dirinfo2.FullName.TrimEnd('\\'), 
    StringComparison.InvariantCultureIgnoreCase)
 

46voto

nawfal Points 13500

A partir de cette réponse , cette méthode peut gérer quelques cas extrêmes:

 public static string NormalizePath(string path)
{
    return Path.GetFullPath(new Uri(path).LocalPath)
               .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
               .ToUpperInvariant();
}
 

Plus de détails dans la réponse originale. Appelez ça comme:

 bool pathsEqual = NormalizePath(path1) == NormalizePath(path2);
 

Devrait fonctionner pour les chemins de fichiers et de répertoires.

11voto

Steven Points 56939

Il y a quelques courtes concerne la mise en œuvre de chemins .NET. Il y a beaucoup de plaintes à ce sujet. Patrick Smacchia, le créateur de NDepend, a publié une bibliothèque open source qui permet la manipulation de la commune et des opérations complexes. Si vous faites beaucoup d'opérations de comparaison sur les chemins dans votre application, cette bibliothèque peut être utile pour vous.

5voto

Igor Korkhov Points 4460

Il semble que P / Invoking GetFinalPathNameByHandle () serait la solution la plus fiable.

UPD: Oups, je n'ai pas pris en compte votre désir de ne pas utiliser d'I / O

1voto

Asad Butt Points 8989
 System.IO.Path.GetFullPath(pathA).Equals(System.IO.Path.GetFullPath(PathB));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X