源代码
/* gfile-copy.c * Heiher <admin@heiher.info> */ #include <gtk/gtk.h> #include <gio/gio.h> static gboolean timeout_handler(gpointer user_data) { gtk_main_quit(); return FALSE; } static void g_file_copy_progress_handler(goffset current_num_bytes, goffset total_num_bytes, gpointer user_data) { GtkProgressBar *progress_bar = GTK_PROGRESS_BAR(user_data); gchar buf[1024] = { 0 }; g_sprintf(buf, "%ld KB / %ld KB", current_num_bytes / 1024, total_num_bytes / 1024); gtk_progress_bar_set_text(progress_bar, buf); gtk_progress_bar_set_fraction(progress_bar, (gdouble)current_num_bytes / (gdouble)total_num_bytes); } static void g_file_copy_async_ready_handler(GObject *source_object, GAsyncResult *res, gpointer user_data) { GtkProgressBar *progress_bar = GTK_PROGRESS_BAR(user_data); g_file_copy_finish(G_FILE(source_object), res, NULL); gtk_progress_bar_set_text(progress_bar, "Finished"); gtk_progress_bar_set_fraction(progress_bar, 1.0); g_timeout_add_seconds(2, timeout_handler, NULL); } int main(int argc, char *argv[]) { GtkWidget *window = NULL; GtkWidget *progress_bar = NULL; GFile *src = NULL, *dst = NULL; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_size_request(window, 400, 30); gtk_widget_show(window); progress_bar = gtk_progress_bar_new(); gtk_container_add(GTK_CONTAINER(window), progress_bar); gtk_widget_show(progress_bar); src = g_file_new_for_path("/tmp/src.img"); dst = g_file_new_for_path("/tmp/dst.img"); g_file_copy_async(src, dst, G_FILE_COPY_OVERWRITE, G_PRIORITY_DEFAULT, NULL, g_file_copy_progress_handler, progress_bar, g_file_copy_async_ready_handler, progress_bar); gtk_main(); return 0; } |
编译、执行
gcc -o gfile-copy gfile-copy.c `pkg-config --cflags --libs gtk+-2.0 gio-2.0` ./gfile-copy |
Over!
看起来不错,不知道局域网内使用效果如何,改天去公司试试
一样的,GVfs 支持 smb 的后端,使用 nautilus 从网络向本地复制文件也是使用 GFile 做的。