2009-11-18 24 views
13

Cho rằng (ít nhất là trên NTFS) hệ thống tập tin trên Windows là trường hợp nhạy cảm, tôi muốn so sánh String fileA để String fileB như vậy:NET Làm thế nào để so sánh hai chuỗi đại diện cho tên tập tin bỏ qua trường hợp một cách chính xác

fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase) 

Câu hỏi sau đó trở thành nền văn hóa nào tôi nên sử dụng, văn bản hiện tại (ui?) Mặc định có đủ không? Tôi dường như không thể tìm thấy bất kỳ phương pháp BCL nào cho mục đích này.

+0

vì mục đích như vậy, tôi luôn đề xuất CultureInfo.InvariantCulture –

Trả lời

19

Bạn nên sử dụng StringComparison.OrdinalIgnoreCase, như được trình bày chi tiết trong Best Practices for Using Strings in the .NET Framework (tìm kiếm cho "đường dẫn tập tin" để tìm phần có liên quan).

Nếu bạn sử dụng một nền văn hóa cho phù hợp với các chuỗi, bạn có thể nhận được trong một sitation nơi ví dụ tên "häl.gif" và "hal.gif" sẽ được coi là một trận đấu.

+2

Nó trả lời câu hỏi. Không nên sử dụng văn hóa. So sánh tên tập tin NTFS là thứ tự. –

+0

Tôi đã cố gắng tìm một tuyên bố chính thức về MSDN hỗ trợ điều này nhưng không thể. Nếu bất cứ ai tìm thấy một xin vui lòng liên kết với nó. –

+1

Dường như được hỗ trợ bởi http://msdn.microsoft.com/en-us/library/dd465121.aspx –

0

Bạn có thể sử dụng InvariantCulture (xem http://msdn.microsoft.com/en-us/library/4c5zdc6a.aspx).

Trong ví dụ của bạn:


FileA.Equals(FileB,StringComparison.InvariantCultureIgnoreCase) 
+2

Không - điều này sẽ không phù hợp với các quy tắc NTFS. Sử dụng So sánh thông thường. –

1

Marcus,

Bạn có thể muốn lúc nhìn vào câu trả lời cho một câu hỏi StackOverflow, mà là rất tương tự: Win32 File Name Comparison, mà lần lượt đề cập đến http://www.siao2.com/2005/10/17/481600.aspx.

Sau một liên kết trong câu trả lời khác cho cùng một câu hỏi và tìm hiểu thêm, tôi đã xem qua bài viết MSDN http://msdn.microsoft.com/en-us/library/ms973919.aspx sau đây. Nó là giá trị đọc nói chung, nhưng khi nói đến tên tập tin so sánh nó khuyến cáo sử dụng StringComparison.OrdinalIgnoreCase. Xem Bảng 1 trong bài viết có chứa đường dẫn tệp dưới dạng một trong các loại dữ liệu được xử lý hoặc sau báo giá:

Vì vậy, khi diễn giải tên tệp, cookie hoặc bất kỳ thứ gì khác giống như kết hợp å có thể xuất hiện, thứ tự so sánh vẫn cung cấp hành vi minh bạch và phù hợp nhất.

Hy vọng điều này giúp, Boaz

1

này không thể làm cách đáng tin cậy.

Có, chuyển đổi trường hợp cho hệ thống tệp phân biệt chữ hoa chữ thường.

Nhưng bảng chuyển đổi trường hợp được lưu trữ trên chính hệ thống tệp (cho NTFS), và nó thay đổi giữa các phiên bản (ví dụ bảng chuyển đổi trường hợp Vista được chuyển sang cấp Unicode 5, vì vậy Vista NTFS và XP NTFS có các quy tắc chuyển đổi trường hợp khác nhau).

Và điều quan trọng là hệ điều hành đã định dạng hệ thống tệp chứ không phải hệ điều hành hiện tại. Sau đó, bạn có thể gặp phải tất cả các vấn đề với các hệ thống tệp khác (Mac OS thực hiện một số loại chuẩn hóa Unicode (không phải chuẩn), Linux không làm gì cả, nhưng Samba (thực hiện giao thức chia sẻ tệp của Windows). làm. Và có các bảng khác so với Windows.

Vậy điều gì sẽ xảy ra nếu tôi ánh xạ một bức thư tới một đĩa mạng được chia sẻ bởi Linux hoặc Mac OS?

Nói chung bạn không bao giờ nên thử so sánh tên tệp. Nếu bạn muốn biết nếu nó có ở đó, hãy thử truy cập nó.

0

Tôi đã thử điều này.

Path.GetFullPath(path1).Equals(Path.GetFullPath(path2)) 
+1

Tốt hơn là 'Path.GetFullPath (path1) .TrimEnd (Path.DirectorySeparatorChar) .Equals (Path.GetFullPath (path2) .TrimEnd (Path.DirectorySeparatorChar))' – SensorSmith

Các vấn đề liên quan