2011-11-18 18 views
5

Muszę usunąć kilkaset plików wewnątrz mojego kodu C. Używam "remove" w pętli. Czy jest jakiś szybszy sposób na to niż użycie "usunięcia"? Pytam o to, ponieważ nie mogę dać wildcharom za pomocą "usunięcia".usuwanie plików z kodu C

+0

Dlaczego nie potrzaskujesz wyniku ls wewnątrz pętli, więc nie będziesz musiał wpisywać wszystkich nazw – lc2817

+0

Problem polega na tym, że w tym katalogu jest 50000 plików. W razie potrzeby muszę usunąć tylko kilka z nich. "usuń" działa dobrze dla mnie, ale ukończenie go zajmuje trochę czasu. Szukam czegoś szybciej. Nie chcę wywoływać poleceń powłoki z "C", jeśli mogę zrobić to samo w "C". – Kitcha

+0

Czy możesz użyć python? :) – lc2817

Odpowiedz

10

Nie, nie ma szybszej metody niż użycie remove() - lub unlink() w systemach POSIX - w pętli.

Komenda system rm również to robi - przynajmniej w prostym, nierekurencyjnym przypadku, w którym nazwy są podane w linii poleceń. Powłoka rozszerza metaznaky i rm (in) słynie z usuwania tego, co zostało mu nakazane, aby usunąć, nie wiedząc o zgubnej notacji, która została użyta w wierszu poleceń. (W rekurencyjnym przypadku, wykorzystuje funkcję taką jak nftw() przemierzać strukturę katalogów w połączeniach głębokość pierwszego rzędu i powtarzających się unlink() usunąć pliki i rmdir() usunąć (teraz już pusty) katalogów.)

POSIX zapewnia funkcje (glob() i wordexp()) do generowania list nazw plików z metaznaków użytych w powłoce (POSIX) plus fnmatch(), aby sprawdzić, czy nazwa pasuje do wzorca.

+0

Czy "*" nie jest takie samo jak "*. *", Czy też jest jakaś subtelna różnica? Kiedy ludzie wymieniają apokalipsę 'rm', zawsze używają' *. * ' –

+0

Pod Windows' *. * 'Było potrzebne; na Uniksie, '*' jest wystarczające (w rzeczywistości bardziej niszczące niż '*. *', ponieważ proste '*' pasuje do więcej nazw). Dyskutowałem marginalnie o tym, którego użyć i (dla lepszego lub gorszego) wybrałem '*. *'. Obie są złe wieści. (I najgorszy kataklizm 'rm' jaki widziałem, polegał na usunięciu konta dla tymczasowego użytkownika utworzonego z katalogu root'/'jako katalogu domowego, a polecenie" usuń użytkownika "usunęło wszystko z katalogu domowego. system może działać po utracie ważnych plików, ale na szczęście był to zupełnie nowy system i była kopia zapasowa z poprzedniego dnia.) –

+0

Dzięki za twój wkład. Mogę wygenerować nazwy plików bez żadnego problemu. Moją jedyną obawą było szybsze wydawanie komendy "usuń". – Kitcha

0

Możesz użyć system, aby utworzyć powłokę, która wykona dla ciebie * rozszerzenie. Prawdopodobnie nie uruchomiłoby się to jednak szybciej niż wywołanie funkcji unlink() w pętli, ponieważ musiałoby ono zarodkować powłokę (rozpocząć nowy proces). Ale łatwiej byłoby kodować.