Vala vermarktet sich als C#-ähnliche Sprache mit nahezu C-artiger Performance, gedacht für die Gnome-Entwicklung. Es übernimmt Async- und Await-Semantik aus C#, und viele I/O-Bibliotheksaufrufe existieren in asynchroner Form, darunter make_directory_async.
async void create_directory_with_parents_async(File file, Cancellable? cancellable = null) throws Error {
var to_create = new File[0];
var? current_target = file;
while(current_target != null) {
try {
yield current_target.make_directory_async(Priority.DEFAULT, cancellable);
} catch(IOError.NOT_FOUND e) {
to_create += current_target;
current_target = current_target.get_parent();
continue;
} catch(IOError.EXISTS e) {
break;
}
break;
}
}Was die Kernbibliothek nicht bietet, ist eine asynchrone Version von create_directory_with_parents, dem rekursiven mkdir-Helfer. Autor Remy Porter vermutet, das Fehlen sei Absicht, da rekursive Verzeichniserstellung Race Conditions mit sich bringt, die lösbar, aber heikel sind.
Ein Leser namens Eri brauchte die fehlende Funktion und schrieb sie selbst. Die erste Schleife versucht, das Zielverzeichnis zu erstellen. Bei IOError.NOT_FOUND steigt sie zum Elternverzeichnis auf und hängt jedes gescheiterte Ziel an ein Array, bis sie auf ein existierendes Verzeichnis trifft, Erfolg hat oder keine Eltern mehr übrig sind. Eine zweite Schleife durchläuft das Array rückwärts und erstellt zuerst die kürzesten fehlenden Pfade, wobei IOError.EXISTS ignoriert wird, falls ein anderer Prozess schneller war.
Die Implementierung nutzt Exceptions zur Ablaufsteuerung, was das Nachverfolgen der ersten Schleife unangenehm macht. Eri bemerkt die Ironie, dass der von Vala gekapselte C-Mechanismus schlichte Fehlercodes nutzt, die hier freundlicher wären. Eine überarbeitete Schleife mit umsortierten Catch-Blöcken liest sich etwas besser, bleibt aber derselbe Ansatz.
Porter gewährt Absolution. Der Code schließt eine echte Lücke in der Kernbibliothek und behandelt die Race Condition korrekt. Sein Rat: in eine Kiste sperren und die Implementierung nie wieder anfassen, außer um sie zu löschen, sobald Vala das Original liefert.




Kommentare
Noch keine Kommentare — schreib den ersten.
Starte die Diskussion
Kein Konto, kein Passwort nötig — gib einfach deine E-Mail-Adresse ein, wir senden dir einen einmaligen Anmelde-Link. Beim ersten Mal bist du damit automatisch angemeldet.
Deine Bewertung wird nach der Anmeldung automatisch übernommen.
Schau in dein Postfach
Wir haben einen Anmelde-Link an … gesendet. Öffne ihn auf diesem Gerät — dieser Tab meldet dich automatisch an.
Nichts angekommen? Wirf einen Blick in den Spam-Ordner — und markiere die Mail dort als „Kein Spam“, dann landet sie künftig direkt im Postfach.