2010-07-01 13 views
7

thể trùng lặp:
How to check whether 2 DirectoryInfo objects are pointing to the same directory?Tại sao so sánh DirectoryInfo này không hoạt động?

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 
} 

Trong khi gỡ lỗi, tôi có thể kiểm tra các giá trị trong mỗi người và họ đều bình đẳng. Vì vậy, tôi đoán đây là một sự hiểu lầm byval byref ... Xin vui lòng một người nào đó, làm thế nào để tôi so sánh hai điều này?

+2

Lý do so sánh các đối tượng DirectoryInfo là gì? Có lẽ bạn nên so sánh .FullPath? – griZZZly8

+0

Đó không phải là những con đường giống nhau. Đây có phải là một loại thử nghiệm Stroop không? –

+2

Ngoài ra, dấu ngoặc ôm của bạn cũng đã được nhận xét. Nếu bạn muốn chúng tôi đặt năng lượng vào để giúp bạn, bạn sẽ không đặt năng lượng vào việc đặt một câu hỏi hay? –

Trả lời

9

Tôi tin rằng bạn muốn làm điều này:

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 
} 

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

Trong bạn ví dụ bạn đang so sánh 2 đối tượng khác nhau thats tại sao họ không bằng nhau. Tôi tin rằng bạn cần phải so sánh Parths để sử dụng mã ở trên.

+1

Hãy nhớ rằng hai đường dẫn tương tự có thể có sự khác biệt so sánh casing => case không nên được sử dụng (như trong các bình luận của câu trả lời của tôi). –

1

Vì nó so sánh hai trường hợp đó, không phải giá trị của chúng (hai tham chiếu).

+0

Chỉ bằng cách sử dụng các thuộc tính, tức là thuộc tính '.FullName' mà bạn đang so sánh giá trị chứ không phải là cá thể? – baron

+4

Trong trường hợp này, có. Một số lớp thực hiện giao diện 'IEquatable ' và ghi đè 'Object.Equals (Object)' cho hoạt động bình đẳng. 'DirectoryInfo' sẽ phải thực hiện' Equals (DirectoryInfo di) {return String.Compare (this.FullName, di.FullName, true) == 0; } 'cho mã ở trên để làm việc (trong số những thứ khác). Thay đổi so sánh vì đường dẫn có thể có vỏ khác nhau. –

4

Tôi đã làm một tìm kiếm Google để "bình đẳng DirectoryInfo" và tìm thấy một số kết quả tốt, trong đó có một trên StackOverflow (How to check whether 2 DirectoryInfo objects are pointing to the same directory?)

Nếu hai Directory.FullName s trận đấu, sau đó bạn biết họ giống nhau, nhưng nếu họ không phù hợp, bạn vẫn không biết nhiều. Có các tên và liên kết ngắn và các nút giao và nhiều lý do khác mà hai chuỗi khác nhau có thể tham chiếu đến cùng một vị trí trên đĩa.

Nếu bạn dựa vào việc biết chắc chắn rằng hai chuỗi không phải là cùng một vị trí và bảo mật bị đe dọa, bạn có thể tạo ra một lỗi bảo mật. Tread cẩn thận.

+3

Một số cách để "đánh lừa" DirectoryInfo: lệnh 'subst', lệnh' net use' hoặc chia sẻ mạng. –

2

Như Jaroslav Jandek nói (xin lỗi tôi không thể bình luận, không đủ uy tín)

Bởi vì nó so sánh hai trường hợp, không phải giá trị của họ (hai tài liệu tham khảo).

Và thực sự nó cũng tương tự đối với tấn các trường hợp khác! Đối với cựu

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

địa chỉ IP Cả đại diện cùng một địa chỉ, nhưng bạn phải hai trường hợp riêng biệt của lớp IPAddress. Vì vậy, tất nhiên "ip1 == ip2" và "ip1.Equals (ip2)" đều sai, bởi vì chúng không trỏ đến cùng một đối tượng.

Bây giờ, nếu bạn chọn "ip1.Address == ip2.Address", kết quả sẽ đúng với IPAddress.Address là "dài", vì vậy bạn so sánh 2 loại giá trị. Lưu ý rằng "ip1.ToString() == ip2.ToString()" cũng sẽ đúng ngay cả khi chuỗi là loại tham chiếu không phải là loại giá trị (nhưng chuỗi thực sự là đặc biệt).

Vì vậy, thực sự trong trường hợp của bạn, bạn muốn so sánh thuộc tính FullName (đó là một chuỗi nên không có vấn đề gì).

Bạn nói

Là nó chỉ bằng cách sử dụng các thuộc tính, ví dụ: tài sản .FullName rằng bạn đang so sánh giá trị chứ không phải là ví dụ?

Thực tế nó có nhiều việc phải làm hơn cho dù thuộc tính là loại giá trị hoặc loại tham chiếu. Ngoài ra, khi so sánh các loại tham chiếu, trong hầu hết các trường hợp, so sánh sẽ có hay không trỏ đến cùng một đối tượng, nhưng có thể ghi đè lên phương thức hoặc tạo toán tử sao cho so sánh được thực hiện trên các đối tượng Jaroslav Jandek đã chỉ ra).

HTH

+0

Vấn đề của dấu gạch chéo cuối cùng vẫn còn. – SerG

+0

@SerG: thực sự. Tôi đã cố gắng để giải thích sự khác biệt ByVal vs ByRef hơn là trả lời câu hỏi cụ thể (và tôi cũng không nghĩ về trường hợp đó). – user276648