2011-11-09 22 views
11

Tôi đang sử dụng lệnh gọi API Windows FindFirstFileFindNextFile để tìm kiếm tệp phù hợp với một chuỗi ký tự đại diện nhất định trong một thư mục. Ví dụ, tôi có thể muốn tìm tất cả các tệp XML trong một thư mục và vì vậy tôi tìm kiếm bằng cách sử dụng mẫu "* .xml".Có cách nào thay thế cho API FindFirstFile/FindNextFile của Windows không tìm kiếm tên tệp ngắn không?

Tôi đang gặp sự cố nếu tôi đang tìm kiếm tiện ích 3 chữ cái và tiện ích mở rộng của tệp bắt đầu bằng tiện ích 3 chữ cái đó, tiện ích mở rộng sẽ được tìm kiếm, ngay cả khi tiện ích có chứa nhiều ký tự hơn sau 3. Ví dụ, nếu tập tin của tôi được đặt tên somelongname.xmlaaaa, điều này sẽ được chọn bởi tìm kiếm "* .xml". Tên ngắn của tệp đó là somelo ~ 1.xml, khớp với chuỗi ký tự đại diện của tôi.

tôi có thể làm ký tự đại diện riêng của tôi phù hợp để có được xung quanh vấn đề này, nhưng có lẽ một API của Windows sẽ có thể thực hiện điều này một cách hiệu quả hơn tôi có thể, và mã của tôi sẽ đơn giản hơn. Theo như tôi có thể nói không có cách nào để buộc các chức năng này bỏ qua các tên ngắn. Có bất kỳ API API nào hiển thị với chức năng này không?

Trả lời

3

Thật không may , tài liệu JoeFish tìm thấy trong câu trả lời của anh hóa ra là một chút gây hiểu nhầm. Tìm kiếm sẽ vẫn tìm thấy các tệp khớp với tên ngắn, ngay cả khi bạn chuyển vào FindExInfoBasic. Nó sẽ không bao gồm tên tệp ngắn trong thành viên cAlternateFileName của cấu trúc WIN32_FIND_DATA.

Tuy nhiên, tôi đã nhận thấy rằng có chức năng Windows PathMatchSpec sẽ thực hiện cùng một ký tự đại diện khớp với chuỗi được cung cấp. Vì vậy, tôi đã có thể thêm một bước thứ hai để tìm kiếm của tôi xác minh rằng tên dài phù hợp với mô hình. Nó thậm chí có sẵn trong Windows XP.

11

Check-out FindFirstFileEx - nó có một tham số fInfoLevelId mà phải mất một liệt kê FINDEX_INFO_LEVELS:

typedef enum _FINDEX_INFO_LEVELS { 
    FindExInfoStandard, 
    FindExInfoBasic, 
    FindExInfoMaxInfoLevel 
} FINDEX_INFO_LEVELS; 

FindExInfoBasic

Chức năng FindFirstFileEx không truy vấn tên tập tin ngắn, cải thiện tốc độ liệt kê tổng thể. Dữ liệu được trả về trong cấu trúc WIN32_FIND_DATA và thành viên cAlternateFileName luôn là một chuỗi NULL.

Tuy nhiên:

Windows Server 2008, Windows Vista, Windows Server 2003 và Windows XP: Giá trị này không được hỗ trợ cho đến khi Windows Server 2008 R2 và Windows 7.

+0

Thú vị. Tôi cần hỗ trợ Windows XP, vì vậy có lẽ tôi không thể dựa vào chức năng này. Thật không may, thực tế là điều này đã được thêm vào API này trong Windows 7 có thể chỉ ra rằng nó không tồn tại trong bất kỳ API khác trước đó. –

+0

Có vẻ như vậy. Xin lỗi đã thất bại bạn :) Và cảm ơn bạn đã chỉnh sửa, @Rob – JoeFish

+0

Hóa ra tài liệu này rất gây hiểu nhầm. Tìm kiếm sẽ vẫn tìm thấy các tệp khớp với tên ngắn, ngay cả khi bạn chuyển vào FindExInfoBasic. Nó sẽ không bao gồm tên tệp ngắn trong thành viên cAlternateFileName của cấu trúc WIN32_FIND_DATA. –

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