Z jakiegoś szalonego powodu nie mogę znaleźć sposobu na pobranie listy plików z globem dla danego katalogu.
Obecnie utknąłem z czymś w rodzaju:
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSArray *dirContents = [[NSFileManager defaultManager]
directoryContentsAtPath:bundleRoot];
.. a potem wyrzucanie rzeczy, których nie chcę, co jest do bani. Ale naprawdę chciałbym móc wyszukać coś takiego jak „foo * .jpg” zamiast pytać o cały katalog, ale nie udało mi się znaleźć czegoś takiego.
Więc jak do cholery to robisz?
ios
objective-c
iphone
cocoa
cocoa-touch
sammich
źródło
źródło
Odpowiedzi:
Możesz to łatwo osiągnąć za pomocą NSPredicate, na przykład:
Jeśli chcesz to zrobić za pomocą NSURL, wygląda to tak:
źródło
Działa to całkiem nieźle w przypadku
IOS
, ale powinno też działać w przypadkucocoa
.źródło
A co z używaniem metod hasSuffix i hasPrefix firmy NSString? Coś takiego (jeśli szukasz „foo * .jpg”):
W przypadku takich prostych, nieskomplikowanych dopasowań byłoby prostsze niż użycie biblioteki wyrażeń regularnych.
źródło
contentsOfDirectoryAtPath:error:
zamiast,directoryContentsAtPath
ponieważ jestdeprecated
odiOS
2.0Najprostsza metoda:
źródło
Unix posiada bibliotekę, która może wykonywać za Ciebie operacje na plikach. Funkcje i typy są zadeklarowane w nagłówku o nazwie
glob.h
, więc będziesz go potrzebować#include
. Jeśli otworzysz terminal i otworzysz stronę podręcznika dla glob, wpisując goman 3 glob
, otrzymasz wszystkie informacje potrzebne do korzystania z funkcji.Poniżej znajduje się przykład, jak można zapełnić tablicę plikami, które pasują do wzorca globbingu. Podczas korzystania z tej
glob
funkcji należy pamiętać o kilku rzeczach.glob
funkcja szuka plików w bieżącym katalogu roboczym. Aby przeszukać inny katalog, musisz dołączyć nazwę katalogu do wzorca globowania, tak jak to zrobiłem w moim przykładzie, aby pobrać wszystkie pliki/bin
.glob
przez wywołanie,globfree
gdy skończysz ze strukturą.W moim przykładzie używam domyślnych opcji i żadnego wywołania zwrotnego błędu. Strona podręcznika zawiera wszystkie opcje na wypadek, gdyby było tam coś, czego chcesz użyć. Jeśli zamierzasz użyć powyższego kodu, sugerowałbym dodanie go jako kategorii do
NSArray
lub czegoś podobnego.Edycja: stworzyłem sedno na github, który zawiera powyższy kod w kategorii o nazwie NSArray + Globbing .
źródło
stringWithCString:
jest przestarzałe. Prawidłowy zamiennik to-[NSFileManager stringWithFileSystemRepresentation:length:]
, chociaż myślę, że większość ludzi używastringWithUTF8String:
(co jest łatwiejsze, ale nie gwarantuje, że będzie to właściwe kodowanie).Musisz zastosować własną metodę, aby wyeliminować pliki, których nie chcesz.
Nie jest to łatwe z wbudowanymi narzędziami, ale możesz użyć RegExKit Lite do pomocy w znalezieniu interesujących Cię elementów w zwracanej tablicy. Zgodnie z uwagami do wydania powinno to działać zarówno w aplikacjach Cocoa, jak i Cocoa-Touch.
Oto kod demo, który napisałem w około 10 minut. Zmieniłem <i> na ", ponieważ nie pojawiały się one w bloku wstępnym, ale nadal działają z cudzysłowami. Może ktoś, kto wie więcej o formatowaniu kodu tutaj w StackOverflow, poprawi to (Chris?).
To jest projekt szablonu narzędzia wiersza poleceń „Foundation Tool”. Jeśli uruchomię demona git na serwerze domowym, edytuję ten post, aby dodać adres URL projektu.
źródło
Nie będę udawać, że jestem ekspertem w tej dziedzinie, ale powinieneś mieć dostęp zarówno do funkcji, jak
glob
iwordexp
od celu-c, nie?źródło
stringWithFileSystemRepresentation nie wydaje się być dostępny w systemie iOS.
źródło
Szybki 5
To działa w przypadku kakao
źródło
Swift 5 na kakao
źródło