Bearbeiten von „Datei search engine.dart“
Zur Navigation springen
Zur Suche springen
Warnung: Du bist nicht angemeldet. Deine IP-Adresse wird bei Bearbeitungen öffentlich sichtbar. Melde dich an oder erstelle ein Benutzerkonto, damit Bearbeitungen deinem Benutzernamen zugeordnet werden.
Die Bearbeitung kann rückgängig gemacht werden. Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und veröffentliche dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.
Aktuelle Version | Dein Text | ||
Zeile 185: | Zeile 185: | ||
Die Methode bereitet die Suche vor und startet sie. | Die Methode bereitet die Suche vor und startet sie. | ||
<pre> | <pre>void search() { | ||
void search() { | |||
String exitMessage; | String exitMessage; | ||
if (verboseLevel >= 2) { | |||
print('= current directory: ${Directory.current.path}'); | |||
} | |||
try { | try { | ||
final pattern2 = searchOptions.word ? '\\b$pattern\\b' : pattern; | final pattern2 = searchOptions.word ? '\\b$pattern\\b' : pattern; | ||
regExp = RegExp(pattern2, caseSensitive: !searchOptions.ignoreCase); | regExp = RegExp(pattern2, caseSensitive: !searchOptions.ignoreCase); | ||
final | final regExprList = <RegExp>[]; | ||
final paths = <String>[]; | final paths = <String>[]; | ||
for (var item in filePatterns) { | for (var item in filePatterns) { | ||
if (FileSystemEntity.isDirectorySync(item)) { | if (FileSystemEntity.isDirectorySync(item)) { | ||
paths.add(item); | paths.add(item); | ||
regExprList.add(null); | |||
} else { | } else { | ||
var ix = item.lastIndexOf(path.separator); | |||
paths.add(ix < 0 ? null : item.substring(0, ix)); | |||
final filePattern = | |||
shellPatternToRegExp(ix < 0 ? item : item.substring(ix + 1)); | |||
regExprList.add(filePattern.isEmpty ? null : RegExp(filePattern)); | |||
} | } | ||
} | } | ||
try { | try { | ||
for (var ix = 0; ix < paths.length; ix++) { | for (var ix = 0; ix < paths.length; ix++) { | ||
searchFilePattern( | searchFilePattern(regExprList[ix], paths[ix] ?? '.', 0); | ||
} | } | ||
} on ExitException catch (exc) { | } on ExitException catch (exc) { | ||
Zeile 237: | Zeile 240: | ||
** <code>if (FileSystemEntity.isDirectorySync(item))</code> Test, ob die Angabe nur ein Verzeichnis ist. | ** <code>if (FileSystemEntity.isDirectorySync(item))</code> Test, ob die Angabe nur ein Verzeichnis ist. | ||
** Wenn ja, Eintrag in die Pfadliste und <code>null</code> in die Namensmusterliste (für "alle Dateien") | ** Wenn ja, Eintrag in die Pfadliste und <code>null</code> in die Namensmusterliste (für "alle Dateien") | ||
** Wenn nein, wird die Angabe in | ** Wenn nein, wird die Angabe in Pfad und Dateinamensmuster zerlegt, das Muster in einen regulären Ausdruck umgewandelt. | ||
** | *** <code>ix = item.lastIndexOf(path.separator);</code> stellt die Grenze zwischen Pfad und Dateimuster fest: das letzte Auftreten des Pfadtrenners. | ||
* <code>for (var ix = 0; ix < paths.length; ix++)</code> eine Schleife über alle | *** Keine Grenze gefunden (<code>ix < 0</code>): dann gibt es keinen Pfad, in die Pfadliste wird <code>null</code> eingetragen, sonst der vordere Teil, der mit <code>substring(0, ix)</code> ermittelt wird. | ||
* <code>searchFilePattern(regExprList[ix], paths[ix], 0);</code> Diese Methode realisiert die eigentliche Suche. | *** <code>ix < 0 ? item : item.substring(ix + 1)</code> Pfadtrenner nicht vorhanden: der ganze String <code>item</code>, sonst der Teil nach dem Trenner: <code>item.substring(ix + 1)</code>. | ||
* <code>for (var ix = 0; ix < paths.length; ix++)</code> eine Schleife über alle Einträge der Pfadliste | |||
* <code>searchFilePattern(regExprList[ix], paths[ix] ?? '.', 0);</code> Diese Methode realisiert die eigentliche Suche. <code>paths[ix] ?? '.'</code> Nimmt den ix-ten Eintrag von <code>paths</code>, wenn der <code>null</code> ist, dann das aktuelle Verzeichnis, das mit '.' bezeichnet wird. | |||
* <code>try { ... } on ExitException catch (exc)</code> Hier werden die "Schnellabbrüche" aufgefangen. Das passiert, wenn eine Bedingung der Optionen <code>--exit-lines</code> oder <code>--exit-files</code> erfüllt ist. | * <code>try { ... } on ExitException catch (exc)</code> Hier werden die "Schnellabbrüche" aufgefangen. Das passiert, wenn eine Bedingung der Optionen <code>--exit-lines</code> oder <code>--exit-files</code> erfüllt ist. | ||
* <code>try {...} on FormatException catch (exc) {</code> Die Ausnahme wird geworfen, wenn der reguläre Ausdruck in <code>regExp = RegExp(pattern2,...)</code> inkorrekt ist. Es wird dann eine Fehlermeldung mittels der Funktion <code>usage()</code> ausgegeben. | * <code>try {...} on FormatException catch (exc) {</code> Die Ausnahme wird geworfen, wenn der reguläre Ausdruck in <code>regExp = RegExp(pattern2,...)</code> inkorrekt ist. Es wird dann eine Fehlermeldung mittels der Funktion <code>usage()</code> ausgegeben. |