2009-08-13 41 views
16

Có cách nào mịn cách để kết xuất trong C hoặc C++ trong Windows không?Globbing in C++/C, trên Windows

Ví dụ: myprogram.exe * .txt gửi chương trình của tôi danh sách ARGV có ... ARGV [1] = *.txt trong đó.

Tôi muốn có thể có một hàm (gọi là readglob) lấy một chuỗi và trả về một vectơ các chuỗi, mỗi chuỗi chứa một tên tệp.

Bằng cách này, nếu tôi có các tệp a.txt b.txt c.txt trong thư mục của mình và readglob nhận được đối số *.txt, nó sẽ trả về tệp danh sách trên.

//Prototype of this hypothetical function. 
vector<string> readglob(string); 

Có phải như vậy không?

Trả lời

23

Liên kết với setargv.obj (hoặc wsetargv.obj) và argv [] sẽ được globbed cho bạn tương tự như cách vỏ Unix làm điều đó:

tôi không thể xác minh cho dù nó hoạt động tốt như thế nào.

+0

Rất khủng khiếp không đa nền tảng, nhưng thật dễ dàng và nó hoạt động. –

+4

Nó không phải là nền tảng chéo vì chỉ có Win32 có vấn đề này! Mẹo hay. –

+2

Chỉ cần thử nó bản thân mình. Làm việc như một nhà vô địch. Không thể dễ dàng hơn. –

0

Ehw. Tôi đã phải thực hiện một cái gì đó như thế này trong ANSI C khoảng 15 năm trước đây. Bắt đầu với các thói quen opendir/readdir ANSI, tôi đoán vậy. Globs không chính xác RegExs, vì vậy bạn sẽ phải thực hiện lọc của riêng bạn.

+0

Theo http://stackoverflow.com/questions/883594/microsoft-visual-studio-opendir-and-readdir-how opendir/readir không có trong Visual Studio. –

+0

Drat! chúng phải là POSIX, chứ không phải ANSI. Bất cứ điều gì xảy ra với lớp Win NT POSIX ??? – Roboprog

2

đã có cuộc trò chuyện về việc có trong hệ thống tệp Boost :: nhưng nó đã bị bỏ qua có lợi cho việc sử dụng tăng :: regex.

Đối với win32 cụ thể (MFC), bạn có thể sử dụng lớp CFileFind

+0

Đó là một con số thấp. Thực hiện kiểm tra nhanh bằng cách sử dụng & #including afx.h kết quả trong một lỗi liên kết liên quan đến mới. 1 cho liên kết, nhưng tôi không muốn ăn tối của tôi làm việc trên làm cho MFC làm việc cho tôi. –

+0

Dường như đối với những thứ không phải MFC, bạn có thể sử dụng FindFirstFile và bạn bè để làm điều đó với mã win32 thẳng. –

+0

MFC chủ yếu là hàm bao quanh các cuộc gọi win32, không thể nhớ FindFirstFile(), tất cả trở lại với tôi ngay bây giờ. –

1

Có thể có một cách tốt hơn bây giờ, nhưng lần cuối cùng tôi đã phải đối phó với vấn đề này tôi đã kết thúc bao gồm Henry Spencer's regex library tĩnh liên kết vào chương trình của tôi (ông thư viện được cấp phép BSD), và sau đó tôi đã tạo một lớp bao bọc để chuyển đổi biểu thức glob của người dùng thành các biểu thức chính quy để nạp vào mã regex. Bạn có thể xem/lấy lớp bao bọc here nếu bạn muốn.

Khi bạn có các phần đó tại chỗ, điều cuối cùng cần làm là đọc thư mục và chuyển từng tên mục nhập vào hàm phù hợp để xem nó có phù hợp với biểu thức hay không. Các tên tệp phù hợp, bạn thêm vào vectơ của mình; những người mà bạn không loại bỏ. Việc đọc thư mục khá đơn giản để thực hiện bằng cách sử dụng các hàm DOS _findfirst() và _findnext(), nhưng nếu bạn muốn có giao diện C++ đẹp hơn, tôi có một lớp portable wrapper cho nó ...

3

Điều này rất đặc trưng cho Windows. Tôi không biết làm thế nào bạn muốn viết này là nền tảng chéo. Nhưng tôi đã sử dụng điều này trong các chương trình Windows và nó hoạt động tốt cho tôi.

// Change to the specified working directory 
string path; 
cout << "Enter the path to report: "; 
cin >> path; 
_chdir(path.c_str()); 

// Get the file description 
string desc; 
cout << "Enter the file description: "; 
cin >> desc; 

// List the files in the directory 
intptr_t file; 
_finddata_t filedata; 
file = _findfirst(desc.c_str(),&filedata); 
if (file != -1) 
{ 
    do 
    { 
    cout << filedata.name << endl; 
    // Or put the file name in a vector here 
    } while (_findnext(file,&filedata) == 0); 
} 
else 
{ 
    cout << "No described files found" << endl; 
} 
_findclose(file); 
+0

không sử dụng thẻ trước/mã, thay vào đó chỉ cần đánh dấu mã và nhấp vào nút có 1/0 trên đó. Nó sẽ làm cho nó hiển thị dưới dạng mã. –

+0

Cảm ơn, Evan. Đó là lần đầu tiên tôi đặt mã trong một câu trả lời. Rõ ràng là ... –

+0

+1 cho mã; Tôi đã chọn câu trả lời của Michael bởi vì nó đơn giản hơn nhiều. :-) –

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