2010-01-28 33 views
6

Có cách nào trong C để xóa (sử dụng remove()) nhiều tệp bằng cách sử dụng * (ký tự đại diện) không? Tôi có một tập hợp các tệp bắt đầu bằng Chỉ mục. Ví dụ: Index1.txt, Index-39.txt v.v. Tất cả đều bắt đầu bằng Chỉ mục nhưng tôi không biết văn bản nào sau đó. Ngoài ra còn có các tệp khác trong cùng một thư mục để xóa tất cả các tệp sẽ không hoạt động.Làm thế nào để loại bỏ nhiều tập tin trong C bằng cách sử dụng ký tự đại diện?

Tôi biết bạn có thể đọc thư mục, lặp lại từng tên tệp, đọc 5 ký tự đầu tiên, so sánh và nếu nó phù hợp thì xóa, nhưng, có cách dễ dàng hơn (đây là những gì tôi hiện đang thực hiện) ?

Đây là tiêu chuẩn C, vì mã chạy trên Linux và Windows.

Trả lời

9

Khi bạn chỉ ra bạn có thể sử dụng diropen, dirread, dirclose để truy cập nội dung thư mục, chức năng của riêng bạn (hoặc chuyển đổi ký tự đại diện thành regex và sử dụng thư viện regex) để khớp và hủy liên kết để xóa.

Không có cách nào tiêu chuẩn để thực hiện việc này dễ dàng hơn. Có khả năng là thư viện, nhưng chúng sẽ không hiệu quả hơn những gì bạn đang làm. Thông thường, chức năng tìm tập tin sẽ gọi lại nơi bạn cung cấp phần kết hợp và hành động của mã. Tất cả những gì bạn muốn tiết kiệm là vòng lặp.

+0

Cảm ơn câu trả lời. Tôi luôn luôn đánh giá cao khi mọi người nói với bạn khi một cái gì đó không thể được thực hiện, thay vì BS'ing bạn. – Uri

+2

Trên Unix thay vì chuyển đổi các ký tự đại diện thành cụm từ thông dụng, bạn nên sử dụng fnmatch (http://www.opengroup.org/onlinepubs/000095399/functions/fnmatch.html). –

6

Nếu bạn không nhớ là nền tảng cụ thể, bạn có thể sử dụng system() gọi:

system("del index*.txt"); // DOS 
system("rm index*.txt"); // unix 

Here là một số tài liệu trên system() cuộc gọi, là một phần của thư viện C chuẩn (cstdlib) .

+2

'hệ thống' là triển khai cụ thể theo định nghĩa, vì vậy tôi luôn thêm người lái để tra cứu tài liệu của nhà cung cấp có liên quan (nếu bạn có thể tìm thấy nó). Nguyên tắc ít ngạc nhiên nhất. – dirkgently

+1

Cảm ơn, nhưng system() là một cơn ác mộng về bảo mật. – Uri

0

Đây có phải là tất cả chương trình không? Nếu vậy, hãy để dòng lệnh thực hiện mở rộng ký tự đại diện cho bạn:

int main(int argc, char* argv[]) 
{ 
    while (argc--) 
    remove(argv[argc]); 
} 

trên Windows, bạn cần liên kết với 'setargv.obj', được bao gồm trong thư mục lib chuẩn của VC.

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