8
votes

Pourquoi cette comparaison de répertoire n'est-elle pas fonctionnant?

Dupliqué possible: strong>
Comment vérifier si 2 annuelsInfo Les objets pointant vers le même répertoire? P>

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 
}


3 commentaires

Quelle raison de comparer des objets DIutiensInfo? Peut-être que vous devriez comparer .fulpath?


Ce ne sont pas les mêmes chemins. Est-ce une sorte de test Streop?


En outre, vos bretelles fermées sont commentées. Si vous voulez que nous mettions de l'énergie pour vous aider, ne vous mettreez-vous pas d'énergie pour poser une bonne question?


4 Réponses :


8
votes

Je crois que vous voulez faire ceci:

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 
}

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


1 commentaires

N'oubliez pas que les mêmes deux chemins peuvent avoir différentes boîtiers => La comparaison insensible à la casse doit être utilisée (comme dans les commentaires de ma réponse).



1
votes

Parce que cela compare ces deux cas, pas leur valeur (deux références).


2 commentaires

Est-ce seulement en utilisant les propriétés, c'est-à-dire la propriété .fulname que vous comparez de la valeur plutôt que de l'instance?


Dans ce cas, oui. Certaines classes implémentent l'interface Iequatable interface et remplacement objet.equals (objet) pour l'opération d'égalité. Le DistoireIfo devrait avoir à avoir implémenté Equals (DirectoryInfo di) {return string.cacher (this.fullName, di.fullName, true) == 0; } pour le code ci-dessus pour fonctionner (entre autres). Modifié la comparaison car les chemins pourraient avoir un boîtier différent.



6
votes

J'ai effectué une recherche Google pour "AnnuaireInfo égalité" et a trouvé plusieurs excellents résultats, dont un sur Stackoverflow ( Comment vérifier si 2 objets de répertoireIfo pointe vers le même répertoire? )

Si deux répertoire.fulname s correspondent, vous savez qu'ils sont les mêmes, mais s'ils ne correspondent pas, vous ne savez toujours pas grand chose. Il existe des noms courts et des liens et des jonctions et de nombreuses autres raisons deux chaînes différentes pourraient faire référence au même emplacement sur disque.

Si vous comptez sur la connaissance de savoir que deux chaînes ne sont pas le même endroit et que la sécurité est en jeu, vous créez probablement un bogue de sécurité. Marcher soigneusement.


1 commentaires

Quelques façons de "tromper" DirectoryInfo: la commande STI , la commande user commande ou partage réseau.



2
votes

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

parce qu'il compare ces deux cas, pas leur valeur (deux Références). P> BlockQuote>

Et en fait, il est pareil pour des tonnes d'autres cas! Pour EX P>

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


2 commentaires

Le problème de la dernière barre oblique reste toujours.


@Sg: En effet. J'essayais plus d'expliquer la différence de Byval contre Byref que de répondre à la question spécifique (et je n'ai pas pensé à cette affaire non plus).