2011-11-18 40 views
5

Tôi phải xóa vài trăm tệp trong mã C của mình. Tôi sử dụng "loại bỏ" trong một vòng lặp. Có cách nào nhanh hơn để làm điều đó hơn là sử dụng "xóa" không? Tôi hỏi điều này bởi vì tôi không thể cung cấp cho wildchars bằng cách sử dụng "loại bỏ".xóa tệp khỏi mã C

+0

Tại sao bạn không kết quả của một ls bên trong vòng lặp để bạn sẽ không phải nhập tất cả các tên – lc2817

+0

Vấn đề là, có 50000 tệp trong thư mục đó. Tôi phải xóa chỉ một vài trong số họ khi cần thiết. "xoá" hoạt động tốt cho tôi nhưng phải mất một lúc để hoàn thành nó. Tôi đang tìm thứ gì đó nhanh hơn. Tôi không muốn gọi các lệnh shell từ "C" nếu tôi có thể thực hiện tương tự trong "C". – Kitcha

+0

Bạn có thể sử dụng python không? :) – lc2817

Trả lời

10

Không, không có cách nào nhanh hơn sử dụng remove() - hoặc unlink() trên hệ thống POSIX - trong một vòng lặp.

Hệ thống rm cũng thực hiện điều đó - ít nhất là trong trường hợp đơn giản, không đệ quy nơi tên được đặt trên dòng lệnh. Vỏ mở rộng các siêu ký tự, và rm (in) nổi tiếng đi cùng xóa những gì nó đã nói để xóa, không biết về các ký hiệu tai hại *.* được sử dụng trên dòng lệnh. (Trong trường hợp đệ quy, nó sử dụng một chức năng như nftw() đi qua cấu trúc thư mục trong các cuộc gọi sâu-đầu tiên trật tự và lặp đi lặp lại để unlink() để loại bỏ các tập tin và rmdir() để loại bỏ các) thư mục (bây giờ có sản phẩm nào.)

POSIX cung cấp chức năng (glob()wordexp()) để tạo danh sách tên tệp từ siêu ký tự như được sử dụng trong vỏ (POSIX), cộng với fnmatch() để xem liệu tên có khớp với mẫu hay không.

+0

Không phải '*' giống như '*. *', Hay có sự khác biệt nào đó không? Khi mọi người đề cập đến một khải huyền 'rm', họ luôn có vẻ sử dụng' *. * ' –

+0

Trong Windows' *. * 'Là cần thiết; trên Unix, '*' là đủ (thực sự, tàn phá hơn '*. *' vì '*' đơn giản khớp với nhiều tên hơn). Tôi đã tranh luận nhẹ về cái nào để sử dụng và (tốt hơn hay tệ hơn) đã chọn '*. *'. Cả hai đều là tin xấu. (Và "catmlysm" tồi tệ nhất mà tôi thấy là xóa tài khoản cho một người dùng tạm thời được tạo bằng root '/' làm thư mục chính của họ; lệnh 'remove user' đã xóa mọi thứ trong thư mục chính của họ. hệ thống có thể chạy sau khi mất các tệp quan trọng. May mắn thay, đó là một hệ thống hoàn toàn mới và đã có bản sao lưu từ ngày hôm trước.) –

+0

Cảm ơn bạn đã nhập. Tôi có thể tạo ra các tên tập tin mà không có bất kỳ vấn đề. Mối quan tâm duy nhất của tôi là phát hành lệnh "remove" nhanh hơn. – Kitcha

0

Bạn có thể sử dụng system để sinh ra một vỏ có thể thực hiện * mở rộng cho bạn. Điều này có lẽ sẽ không chạy nhanh hơn chỉ gọi unlink() trong một vòng lặp, mặc dù, bởi vì nó sẽ phải sinh ra một trình bao (bắt đầu một quá trình mới). Nhưng nó sẽ dễ dàng hơn để viết mã.