2012-01-08 19 views
11

Có thể sử dụng chức năng API của Windows FindFirstFile để tìm kiếm nhiều loại tệp, ví dụ: *.txt*.doc cùng một lúc?FindFirstFile Nhiều loại tệp

Tôi cố gắng tách riêng các mẫu với '\0' nhưng không hoạt động - nó chỉ tìm kiếm mẫu đầu tiên (tôi đoán, đó là vì nó cho rằng '\0' là phần cuối của chuỗi).

Tất nhiên, tôi có thể gọi FindFirstFile với mẫu *.* rồi kiểm tra mẫu của tôi hoặc gọi mẫu cho mọi mẫu, nhưng tôi không thích ý tưởng này - tôi sẽ chỉ sử dụng nó nếu không có giải pháp nào khác.

+0

Theo hiểu biết tốt nhất của tôi, bạn không thể chỉ định nhiều ký tự đại diện. Bạn sẽ phải sử dụng '*' và tự lọc. –

Trả lời

15

Điều này không được hỗ trợ. Chạy nó hai lần với các ký tự đại diện khác nhau. Hoặc sử dụng *.* và lọc kết quả. Điều này chắc chắn là sự lựa chọn tốt hơn, ký tự đại diện là mơ hồ anyway do hỗ trợ cho MS-DOS 8.3 tên tập tin di sản. Ví dụ: ký tự đại diện như * .doc sẽ tìm cả tệp .doc và .docx. Tên tệp như longfilename.docx cũng tạo một mục có tên là LONGFI~1.DOC

5

MSDN docs không đề cập gì về việc FindFirstFile cho phép nhiều mẫu tìm kiếm, do đó nó không tồn tại.

Trong trường hợp này đặt cược tốt nhất của bạn là để quét sử dụng một lựa chọn mở (như C:\\some directory\* hoặc *) và sau đó lọc dựa trên cFileName viên WIN32_FIND_DATA 's, sử dụng strrchr (hoặc thích hợp Unicode biến thể) để tìm phần mở rộng. Nó sẽ chạy khá nhanh cho các bộ ký tự nhỏ tạo nên phần mở rộng tập tin.

Nếu bạn biết rằng tất cả các tiện ích mở rộng đều có 3 ký tự, bạn sẽ có thể che giấu nó thành *.??? để tăng tốc độ.

+0

Vấn đề về hiệu suất không mất bao lâu để lọc tên tệp, vì điều đó phải được thực hiện ở đâu đó. Đó là một thực tế rằng bạn đang nhấn một chức năng API một lần nữa và một lần nữa. Tuy nhiên, FindNextFile khá hiệu quả trong kinh nghiệm của tôi nên tôi nghi ngờ rằng đó là một vấn đề. –

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