Aus irgendeinem verrückten Grund kann ich keine Möglichkeit finden, eine Liste von Dateien mit einem Glob für ein bestimmtes Verzeichnis zu erhalten.
Ich bin derzeit mit etwas in der Art festgefahren wie:
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSArray *dirContents = [[NSFileManager defaultManager]
directoryContentsAtPath:bundleRoot];
..und dann das Zeug ausziehen, das ich nicht will, was scheiße ist. Aber was ich wirklich möchte, ist, nach etwas wie "foo * .jpg" suchen zu können, anstatt nach dem gesamten Verzeichnis zu fragen, aber ich konnte so etwas nicht finden.
Also, wie zum Teufel machst du das?
ios
objective-c
iphone
cocoa
cocoa-touch
sammich
quelle
quelle
Antworten:
Sie können dies ziemlich einfach mit Hilfe von NSPredicate erreichen, wie folgt:
Wenn Sie es stattdessen mit NSURL tun müssen, sieht es so aus:
quelle
Das funktioniert ganz gut für
IOS
, sollte aber auch funktionierencocoa
.quelle
Was ist mit der Verwendung der hasSuffix- und hasPrefix-Methoden von NSString? So etwas wie (wenn Sie nach "foo * .jpg" suchen):
Für einfache, unkomplizierte Übereinstimmungen wie diese wäre es einfacher als die Verwendung einer Regex-Bibliothek.
quelle
contentsOfDirectoryAtPath:error:
anstelle von verwenden,directoryContentsAtPath
weil esdeprecated
seitiOS
2.0 istSehr einfachste Methode:
quelle
Unix verfügt über eine Bibliothek, die Datei-Globbing-Vorgänge für Sie ausführen kann. Die Funktionen und Typen werden in einem Header deklariert genannt
glob.h
, so dass Sie brauchen#include
es. Wenn Sie ein Terminal öffnen und die Manpage für glob durch Eingabe öffnen,man 3 glob
erhalten Sie alle Informationen, die Sie zur Verwendung der Funktionen benötigen.Im Folgenden finden Sie ein Beispiel dafür, wie Sie ein Array mit Dateien füllen können, die einem Globbing-Muster entsprechen. Wenn Sie die
glob
Funktion verwenden, müssen Sie einige Dinge beachten.glob
sucht die Funktion nach Dateien im aktuellen Arbeitsverzeichnis. Um ein anderes Verzeichnis zu durchsuchen, müssen Sie den Verzeichnisnamen wie in meinem Beispiel dem Globbing-Muster voranstellen, um alle Dateien abzurufen/bin
.glob
,globfree
indem Sie aufrufen, wenn Sie mit der Struktur fertig sind.In meinem Beispiel verwende ich die Standardoptionen und keinen Fehlerrückruf. Die Manpage enthält alle Optionen für den Fall, dass Sie etwas verwenden möchten. Wenn Sie den obigen Code verwenden möchten, würde ich vorschlagen, ihn als Kategorie
NSArray
oder ähnliches hinzuzufügen .Bearbeiten: Ich habe einen Kern auf Github erstellt, der den obigen Code in einer Kategorie namens NSArray + Globbing enthält .
quelle
stringWithCString:
ist veraltet. Der richtige Ersatz ist-[NSFileManager stringWithFileSystemRepresentation:length:]
, obwohl ich denke, dass die meisten Leute verwendenstringWithUTF8String:
(was einfacher ist, aber nicht garantiert die richtige Codierung ist).Sie müssen Ihre eigene Methode rollen, um die Dateien zu entfernen, die Sie nicht möchten.
Dies ist mit den integrierten Tools nicht einfach, aber Sie können RegExKit Lite verwenden , um die Elemente in dem zurückgegebenen Array zu finden, an dem Sie interessiert sind. Gemäß den sollte dies sowohl in Cocoa- als auch in Cocoa-Touch-Anwendungen funktionieren.
Hier ist der Demo-Code, den ich in ungefähr 10 Minuten geschrieben habe. Ich habe das <und> in "geändert, weil sie nicht im Vorblock angezeigt wurden, aber es funktioniert immer noch mit den Anführungszeichen. Vielleicht korrigiert dies jemand, der mehr über das Formatieren von Code hier auf StackOverflow weiß (Chris?).
Dies ist ein Vorlagenprojekt für das Befehlszeilenprogramm "Foundation Tool". Wenn ich meinen Git-Daemon auf meinem Heimserver zum Laufen bringe, bearbeite ich diesen Beitrag, um die URL für das Projekt hinzuzufügen.
quelle
Ich werde nicht vorgeben, ein Experte für das Thema zu sein, aber Sie sollten Zugriff auf sowohl die
glob
als auch diewordexp
Funktion von Ziel-C haben, nicht wahr?quelle
stringWithFileSystemRepresentation scheint in iOS nicht verfügbar zu sein.
quelle
Swift 5
Dies funktioniert für Kakao
quelle
Swift 5 für Kakao
quelle