2012-01-10 15 views
6

Gần đây tôi tình cờ gặp một chức năng kỳ lạ từ Microsoft:chức năng Weird trong Directory.GetFiles NET của() khi mô hình tìm kiếm chứa 3 ký tự gia hạn

Giả sử thư mục của chúng tôi c:\tmp123 chứa 3 file -
1.txt
2.txtx
3.txtxt

a) Yêu cầu Directory.GetFiles(@"C:\tmp123", "*.txt") cho 3 mục được trả về.
b) Gọi Directory.GetFiles(@"C:\tmp123", "*.txtx") sản lượng trong 1 mục được trả về.

Theo Microsoft, đây là hành vi mong đợi (xem Lưu ý trong MSDN).

Câu hỏi của tôi là:

  1. Tại sao Microsoft quyết định để có một chức năng kỳ lạ như vậy?

  2. Làm cách nào để khắc phục sự cố này?
    tức là làm cách nào để tôi có Mẫu tìm kiếm chỉ trả về *.txt tiện ích mở rộng và không trả lại *.txtx, *.txtstarngefunctionality, v.v ...?

Trả lời

0

Tôi sẵn sàng đặt cược điều gì đó liên quan đến tính tương thích ngược. Tôi không thấy vấn đề này chính xác đã đề cập, nhưng this Raymond Chen blogpost đề cập đến một số oddities trong lĩnh vực này:

[...] một số tật của thuật toán phù hợp FCB kéo dài sang Win32 vì họ đã trở thành thành ngữ.

Ví dụ: nếu mẫu của bạn kết thúc bằng .*, thì hãy bỏ qua .*. Nếu không có quy tắc này, mẫu *.* sẽ chỉ khớp với các tệp có chứa dấu chấm, có thể phá vỡ 90% tất cả các tệp hàng loạt trên hành tinh, cũng như bộ nhớ cơ của mọi người, kể từ khi mọi người chạy Windows NT 3.1 lớn lên một thế giới nơi *.* có nghĩa là tất cả các tệp.

Ví dụ khác, một mẫu kết thúc bằng dấu chấm không thực sự là tệp đối sánh kết thúc bằng dấu chấm; nó khớp với các tệp không có phần mở rộng. Và dấu chấm hỏi có thể khớp với 0 ký tự nếu nó xuất hiện ngay lập tức trước dấu chấm.

2

Lý do cho điều này là khả năng tương thích ngược.

Windows ban đầu được xây dựng dưới dạng giao diện đồ họa trên đầu MSDOS chỉ có tệp có 8 ký tự cho tên và tối đa 3 đối với phần mở rộng. Sự mở rộng cho các hệ thống tệp MSDOS cho phép Windows có tên tệp và phần mở rộng dài hơn nhưng chúng vẫn hiển thị dưới dạng tên tệp 8.3 trong MSDOS.

Vì dấu nhắc lệnh trên Windows là sự tiến hóa của trình thông dịch lệnh cũ trong MSDOS, điều này có nghĩa là một số hành vi "lỗi thời" (như mẫu tìm kiếm 3 chữ cái) được lưu giữ để ứng dụng và tập lệnh được tạo trong "ngày cũ" hoặc "bộ hẹn giờ cũ" sẽ không bị hỏng.

(ví dụ khác là một thực tế đa số các hệ cửa sổ tập tin là trường hợp nhạy cảm, vâng, bạn đoán, bởi vì một trong MSDOS không có vỏ)

+0

(NTFS có thể [trường hợp nhạy cảm] (http://support.microsoft.com/kb/100625)) –

1

Nếu bạn muốn có một cách giải quyết, bạn chỉ có thể lấy tất cả các tập tin đường dẫn

var files = Directory.GetFiles(@"C:\tmp123"); 

và sau đó lọc chúng bằng cách mở rộng khi cần thiết

var txtFiles = files.Where(f => f.EndsWith(".txt")); 
var txtxFiles = files.Where(f => f.EndsWith(".txtx")); 
0

Dưới đây là một cách giải quyết mà sẽ giúp lọc ra các file wi các tiện ích mở rộng thứ như ".txtxt":

var Files = System.IO.Directory.GetFiles("*.txt").Where(item => item.Extension.ToString().ToLower() == ".txt"); 
Các vấn đề liên quan