Skip to content

Instantly share code, notes, and snippets.

@Bambofy
Created April 7, 2024 20:53
Show Gist options
  • Save Bambofy/d0c37a9d32fc03c72e8f35c12c5215c9 to your computer and use it in GitHub Desktop.
Save Bambofy/d0c37a9d32fc03c72e8f35c12c5215c9 to your computer and use it in GitHub Desktop.
GTK create a queue of all the files in a directory recursively
#include <gtk/gtk.h>
/*
* Iterates a directory and all of its subdirectories to produce a list of the
* paths of the files inside of them.
*/
GQueue* list_directory(GString* dir_path) {
GQueue* unchecked_queue;
GQueue* checked_queue;
unchecked_queue = g_queue_new();
checked_queue = g_queue_new();
g_queue_push_tail(unchecked_queue, dir_path);
while (!g_queue_is_empty(unchecked_queue)) {
GString* dequed_item_path;
GFile* dequed_file;
dequed_item_path = g_queue_pop_head(unchecked_queue);
dequed_file = g_file_new_for_path(dequed_item_path->str);
if (g_file_query_file_type(dequed_file, G_FILE_QUERY_INFO_NONE, NULL) == G_FILE_TYPE_DIRECTORY) {
GFileEnumerator* enumerator;
GFileInfo* enumerated_file_info;
enumerator = g_file_enumerate_children(dequed_file,
G_FILE_ATTRIBUTE_STANDARD_NAME,
G_FILE_QUERY_INFO_NONE,
NULL,
NULL);
enumerated_file_info = g_file_enumerator_next_file(enumerator,
NULL,
NULL);
while (enumerated_file_info != NULL) {
GString* enumerated_file_path;
enumerated_file_path = g_string_new(dequed_item_path->str);
enumerated_file_path = g_string_append(enumerated_file_path, G_DIR_SEPARATOR_S);
enumerated_file_path = g_string_append(enumerated_file_path,
g_file_info_get_name(enumerated_file_info));
g_queue_push_tail(unchecked_queue, enumerated_file_path);
enumerated_file_info = g_file_enumerator_next_file(enumerator,
NULL,
NULL);
}
g_queue_push_tail(checked_queue, dequed_item_path);
}
}
g_queue_free(unchecked_queue);
return checked_queue;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment