2012-05-16 38 views
5

Tôi nên tìm nạp một tệp nào từ một trang web bằng cách sử dụng gtk libs?Tìm nạp một tệp từ web: trong GTK bằng C

Nếu tập tin của tôi là từ:

gchar * path = "http: //xxx.yyyServer/sharing/temp.txt"

Tôi nên làm gì để tải về nó?

Đối với các tệp cục bộ, tôi chỉ sử dụng các thư viện C như fopen và fread.

Tôi nên làm như thế nào?

Rất tiếc, không có ví dụ về xử lý tệp trong Hướng dẫn. Tôi chỉ có thể thấy Trình chọn tệp từ hộp thoại Tệp.

Vui lòng trợ giúp noob này.

Cảm ơn

CẬP NHẬT VỚI CÔNG TÁC MÃ TỪ NHẬN XÉT: Đoạn code dưới đây làm việc cho các tập tin nhị phân có kích thước chưa biết.

char *name= http://127.0.0.1:8000/mybinfile 


int getFile(char *name) 
{ 

    GFile *f = g_file_new_for_uri(name); 
    GFileInputStream *fis = NULL; 
    GDataInputStream* dis = NULL; 
    GError *err = NULL; 
    //char buffer[2048]; 
    char *buffer; 
    size_t length; 
    int ret = -1; 

    GFileInfo *info; 

    int total_size = -1; 

    /* get input stream */ 
    fis = g_file_read(f, NULL, &err); 

    if (err != NULL) { 
     fprintf(stderr, "ERROR: opening %s\n", name); 
     g_object_unref(f); 
     return -1; 
    } 

    info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (fis),G_FILE_ATTRIBUTE_STANDARD_SIZE,NULL, &err); 
    if (info) 
    { 
     if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE)) 
      total_size = g_file_info_get_size (info); 
      printf("total_size = %d\n", total_size); 
      g_object_unref (info); 
    } 

    // fill buffer 
    if(total_size > 0){ 
     buffer = (char *) malloc(sizeof(char) * total_size); 
     memset(buffer, 0, total_size); 
     if ((length = g_input_stream_read (G_INPUT_STREAM(fis), 
        buffer, total_size, NULL, &err)) != -1) { 
       printf("reading file\n"); 
     } 
     printf("File length = %d\n", length); 

      ret = 0; 
     } 
     // close streams 
     g_object_unref(fis); 
     g_object_unref(f); 
     return ret; 
    } 
+4

CURL có thể thực hiện công việc. – nullpotent

+0

Làm thế nào về một hack bẩn? int meh = system ("wget" + name); – Mikhail

Trả lời

11

HTTP là một trong các giao thức được GIO hỗ trợ, vì vậy bạn có thể mở URI HTTP giống như bất kỳ tệp nào khác khi sử dụng hàm GIO thay vì hàm C chuẩn. Chỉ cần sử dụng g_file_new_for_uri để tạo đối tượng tệp và sau đó bạn có thể đọc nó giống như một tệp cục bộ.

Bạn có thể sử dụng g_file_read để nhận GFileInputStream cho URI đã cho và sau đó g_data_input_stream_new để nhận GDataInputStream cho luồng đầu vào, sau đó bạn có thể sử dụng để đọc tệp theo từng dòng. Bạn phải upcast GFileInputStream đến một GInputStream trước khi bạn có thể chuyển nó đến g_data_input_stream_new (hoặc trước khi bạn có thể làm bất cứ điều gì khác hữu ích với nó), nhưng nếu bạn đang lập trình GTK trong C, bạn có thể đã quen với điều đó ngay bây giờ.

+0

Cảm ơn sepp2k. Tôi sẽ thử nó và một khi mã hoạt động đăng nó cho hậu thế;) – user907810

+0

Làm thế nào để có được kích thước của tập tin trước khi phân bổ một bộ đệm thích hợp để đọc nó? Trong C tôi sẽ làm điều này bằng cách sử dụng fseek và ftell. Điều này có thể xảy ra trong GTK không? – user907810

+0

@ user907810 Bạn có thể nhận đối tượng GFileInfo từ đối tượng tệp và sau đó gọi g_file_info_get_size trên đó. – sepp2k

-1

Tôi là một noob giống như bạn với GTK (thậm chí có thể nhiều hơn) nhưng tôi nghi ngờ rằng không có cách "một hướng" để tải xuống tệp trong C/C++. Bạn phải sử dụng các công cụ bên ngoài (wget, v.v.) hoặc tự viết một quy trình GET. Here là ví dụ về tệp tải xuống trong C bằng cách sử dụng libcurl. Chúc may mắn!

+0

Thành thật mà nói, từ tài liệu gtk tôi thấy không có ví dụ về xử lý tập tin ngoại trừ một hộp thoại File Chooser và do đó ngay cả đối với đọc tập tin địa phương tôi chỉ đơn giản là mã hóa với C phong cách ... – user907810

+0

Vấn đề duy nhất với việc sử dụng libcurl là, tôi có để cài đặt thư viện libcurl. Trên thực tế tôi đang lập trình cho một ứng dụng ARM nhúng và nếu lib này là không có sẵn theo mặc định tôi phải sau đó vượt qua biên dịch nó .. – user907810

Các vấn đề liên quan