GTK+中文社区(gtk.awaysoft.com)

 找回密码
 马上加入

QQ登录

只需一步,快速开始

查看: 8767|回复: 12

GTK+写的MD5计算工具

[复制链接]
  • TA的每日心情
    奋斗
    2021-11-19 13:15
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2010-9-17 10:00:48 | 显示全部楼层 |阅读模式
    利用GLib库的GChecksum,对文件进行MD5计算。

    所用知识:
    GChecksum的简单使用,FILE读取文件,stat获取文件大小,简单GTK+布局,信号绑定。

    界面如下:
      

    代码如下:
    1. /*
    2.     Creator by Tom
    3.     E-mail:Tom@awaysoft.com
    4.     gtk.awaysoft.com
    5. */
    6. #include <stdlib.h>
    7. #include <stdio.h>
    8. #include <string.h>
    9. #include <gtk/gtk.h>
    10. #include <sys/stat.h>
    11. GtkWidget *choose_button = NULL;
    12. static void calc_Md5 (GtkWidget *wid, GtkWidget *win)
    13. {
    14.   GtkWidget *dialog = NULL;
    15.   gchar *filename = NULL;
    16.   const gchar *result = NULL;
    17.   gchar mess[33];
    18.   filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(choose_button));
    19.   if (filename){
    20.     GChecksum * checksum;
    21.     guchar * buffer = NULL;
    22.     FILE *fp = NULL;
    23.     if ((fp = fopen(filename, "rb"))!=NULL){
    24.         /* get file size */
    25.         struct stat filesize;
    26.         stat(filename, &filesize);
    27.         int file_no = filesize.st_size;
    28.         if (file_no != -1){
    29.             /* read buffer */
    30.             buffer = (guchar *)g_malloc(sizeof(guchar)*file_no);
    31.             fread(buffer, file_no, 1, fp);
    32.             /* checksum */
    33.             checksum = g_checksum_new(G_CHECKSUM_MD5);
    34.             g_checksum_update(checksum, (const guchar *)buffer, file_no);
    35.             result = g_checksum_get_string(checksum);
    36.             g_free(buffer);
    37.         }else{
    38.             strcpy ((gchar *)result, "文件打开失败!");
    39.         }
    40.         fclose(fp);
    41.     }else{
    42.         strcpy ((gchar *)result, "文件打开失败!");
    43.     }
    44.     strcpy(mess, result);
    45.     g_free((gchar *)result);
    46.     g_free(filename);
    47.   }else{
    48.     strcpy(mess, "请选择或者拖动一个文件!");
    49.   }
    50.   dialog = gtk_message_dialog_new (GTK_WINDOW (win), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, mess);
    51.   gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
    52.   gtk_dialog_run (GTK_DIALOG (dialog));
    53.   gtk_widget_destroy (dialog);
    54. }
    55. int main (int argc, char *argv[])
    56. {
    57.   GtkWidget *button = NULL;
    58.   GtkWidget *win = NULL;
    59.   GtkWidget *vbox = NULL;
    60.   GtkWidget *hbox = NULL;
    61.   GtkWidget *label = NULL;
    62.   /* Initialize GTK+ */
    63.   g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
    64.   gtk_init (&argc, &argv);
    65.   g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);
    66.   /* Create the main window */
    67.   win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    68.   gtk_container_set_border_width (GTK_CONTAINER (win), 8);
    69.   gtk_window_set_title (GTK_WINDOW (win), "MD5 计算");
    70.   gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
    71.   gtk_widget_realize (win);
    72.   gtk_widget_set_size_request(win, 200,100);
    73.   g_signal_connect (win, "destroy", gtk_main_quit, NULL);
    74.   /* Create a vertical box with buttons */
    75.   vbox = gtk_vbox_new (TRUE, 6);
    76.   gtk_container_add (GTK_CONTAINER (win), vbox);
    77.   hbox = gtk_hbox_new (FALSE, 6);
    78.   gtk_box_pack_start(GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
    79.   label = gtk_label_new("文件:");
    80.   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
    81.   choose_button = gtk_file_chooser_button_new ("选择一个文件",
    82.                                         GTK_FILE_CHOOSER_ACTION_OPEN);
    83.   gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (choose_button),
    84.                                        "$HOME");
    85.   gtk_box_pack_start (GTK_BOX (hbox), choose_button, TRUE, TRUE, 0);
    86.   hbox = gtk_hbox_new (TRUE, 6);
    87.   gtk_box_pack_start(GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
    88.   button = gtk_button_new_with_label("计算");
    89.   gtk_box_pack_start(GTK_BOX (hbox), button, TRUE, TRUE, 0);
    90.   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (calc_Md5), (gpointer) win);
    91.   button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
    92.   g_signal_connect (button, "clicked", gtk_main_quit, NULL);
    93.   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
    94.   /* Enter the main loop */
    95.   gtk_widget_show_all (win);
    96.   gtk_main ();
    97.   return 0;
    98. }
    复制代码

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?马上加入

    x
  • TA的每日心情
    无聊
    2013-9-23 22:35
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2010-9-17 16:14:01 | 显示全部楼层
    嘿,也可以直接调用md5sum……
  • TA的每日心情
    奋斗
    2021-11-19 13:15
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2010-9-17 18:44:41 | 显示全部楼层
    嗯,不过,貌似那就要用管道了。。。。更麻烦啊。。。。
  • TA的每日心情
    无聊
    2013-9-23 22:35
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2010-9-17 22:45:02 | 显示全部楼层
    用exec*啊
  • TA的每日心情
    奋斗
    2021-11-19 13:15
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2010-9-18 02:43:10 | 显示全部楼层
    exec 没用过,不过要获得返回值,也必须要管道吧?

    该用户从未签到

    发表于 2010-10-29 05:00:03 | 显示全部楼层
    gtk的文件选择窗口不怎么好用啊

    该用户从未签到

    发表于 2010-10-30 07:05:06 | 显示全部楼层
    收藏先。。。对小菜来说一个学习的阶梯。。。
  • TA的每日心情
    奋斗
    2021-11-19 13:15
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2010-11-1 05:56:25 | 显示全部楼层
    引用第5楼pp245610587于2010-10-28 21:00发表的  :
    gtk的文件选择窗口不怎么好用啊
    呵呵,习惯了就好。。。
  • TA的每日心情
    慵懒
    2013-7-6 15:08
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]初来乍到

    发表于 2011-1-27 16:05:22 | 显示全部楼层
    popen一个md5sum岂不是更简单?read出来返回值就可以……

    该用户从未签到

    发表于 2011-2-15 22:58:07 | 显示全部楼层
    很不错,学习了。
    *滑块验证:
    您需要登录后才可以回帖 登录 | 马上加入

    本版积分规则

    申请友链|Archiver|小黑屋|手机版|GTK+中文社区 ( 粤ICP备13080851号 )

    我要啦免费统计

    GMT+8, 2024-11-21 19:06 , Processed in 0.037515 second(s), 7 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表