为什么这个DirectoryInfo比较不起作用?

时间:2010-07-01 04:09:46

标签: c# visual-studio comparison logic directoryinfo

  

可能重复:
  How to check whether 2 DirectoryInfo objects are pointing to the same directory?

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 
}

在调试时,我可以检查每个中的值,它们是相等的。所以我猜这是另一个byval byref误解......请有人,我该如何比较这两件事?

4 个答案:

答案 0 :(得分:9)

我相信你想这样做:

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 :(得分:5)

我为Google Directory搜索了“DirectoryInfo相等”并找到了几个很棒的结果,包括一个关于StackOverflow(How to check whether 2 DirectoryInfo objects are pointing to the same directory?

的结果

如果两个Directory.FullName匹配,那么您知道它们 相同,但如果它们不匹配,您仍然不太了解。有短名称,链接和联结以及许多其他原因,两个不同的字符串可以引用磁盘上的相同位置。

如果您指望确定两个字符串不是同一个位置,并且安全性受到威胁,那么您可能会产生安全漏洞。小心翼翼。

答案 2 :(得分:2)

正如Jaroslav Jandek所说(对不起,我无法评论,声誉不够)

  

因为它比较了这两者   实例,而不是它们的价值(两个   参考文献)。

实际上,对于其他大量案件来说,情况也是如此!对于前

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

两个IP地址代表相同的地址,但您有两个不同的实例的IPAddress类。所以当然“ip1 == ip2”和“ip1.Equals(ip2)”都是假的,因为它们没有指向同一个对象。

现在,如果你检查“ip1.Address == ip2.Address”,结果将为true,因为IPAddress.Address是一个“long”,所以你要比较2种值类型。请注意,即使字符串是引用类型而不是值类型(但字符串确实是特殊字符串),“ip1.ToString()== ip2.ToString()”也将为true。

所以在您的情况下确实要比较FullName属性(这是一个字符串,所以没问题)。

你说

  

是否仅使用属性,即您要比较值而不是实例的.FullName属性?

实际上,它更多地与属性是值类型还是引用类型有关。此外,在比较参考类型时,在大多数情况下,比较将是它们是否指向同一个对象,但是可以覆盖方法或创建运算符,以便在内容上进行比较。对象(再次像Jaroslav Jandek已经指出的那样)。

HTH

答案 3 :(得分:1)

因为它比较了这两个实例,而不是它们的值(两个引用)。