async void rm_rf_async (File directory, Cancellable? cancellable) throws Error { if (cancellable.is_cancelled()) return; var children = yield directory.enumerate_children_async (FileAttribute.STANDARD_NAME, FileQueryInfoFlags.NOFOLLOW_SYMLINKS, Priority.DEFAULT, cancellable); GLib.List fileinfos; while ((fileinfos = yield children.next_files_async (8, Priority.DEFAULT, cancellable)) != null) { foreach (var child_finfo in fileinfos) { var child = directory.get_child (child_finfo.get_name()); var ftype = child.query_file_type (FileQueryInfoFlags.NOFOLLOW_SYMLINKS); if (ftype == FileType.DIRECTORY) { yield rm_rf_async (child, cancellable); } else { print (@"rm $(child.get_path())\n"); child.delete (cancellable); } } } print (@"rmdir $(directory.get_path())\n"); directory.delete (cancellable); } int main () { //string temp_dir = DirUtils.make_tmp ("my-XXXXXX-dir"); //stdout.printf ("make_tmp (\"my-XXXXXXX-dir\") = %s\n", temp_dir); // async example var loop = new MainLoop(); rm_rf_async.begin(File.new_for_path("/tmp/aaa"), null, (obj, res) => { try { rm_rf_async.end(res); loop.quit(); } catch (Error e) { stderr.printf ("Error: %s\n", e.message); //return -1; } }); loop.run(); return 0; }