2012-05-16 5 views
5

gtkのライブラリを使用してWebからファイルを取得する機能はありますか?Webからファイルを取得する:Cを使用してGTKで

私のファイルがある場合から:

gchar *パス= "のhttp://xxx.yyyServer/sharing/temp.txt"

私はそれをダウンロードするために何をすべき?

ローカルファイルの場合、私は単にfopenやfreadのようなCライブラリを使用します。

どのようにすればいいですか?

チュートリアルでは、ファイル処理の例はありません。私はファイルダイアログボックスからファイル選択を見ることしかできません。

このnoobをお手伝いください。コメントからWORKING CODEで更新

おかげ

: 不明サイズのバイナリファイルのための作品次のコード。

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が仕事をする可能性があります。 – nullpotent

+0

汚れたハックはいかがですか? int meh = system( "wget" + name); – Mikhail

答えて

11

HTTPはGIOでサポートされているプロトコルの1つで、標準のC関数の代わりにGIO関数を使用する場合、他のファイルと同様にHTTP URIを開くことができます。 g_file_new_for_uriを使ってファイルオブジェクトを作成し、それをローカルファイルのように読むことができます。

あなたは、ファイルのライン・バイ・ラインを読み取るために使用することができ、入力ストリームのためのGDataInputStreamを取得するために指定されたURIのためのGFileInputStreamを取得するためにg_file_readを使用し、g_data_input_stream_newことができます。 g_data_input_stream_newに渡す前にGFileInputStreamをGInputStreamにアップキャストしなければなりません(またはそれ以外の何かをする前に)が、GTKをC言語でプログラミングしているなら、おそらくこれまで慣れているはずです。

+0

sepp2kありがとうございます。私はそれを試してみようとし、コードは後世のために投稿します) – user907810

+0

ファイルの読み込みに適切なバッファを割り当てる前に、ファイルのサイズを事前に取得するにはどうすればよいですか?私はfseekとftellを使ってこれを行います。これはGTKでも可能ですか? – user907810

+0

@ user907810ファイルオブジェクトからGFileInfoオブジェクトを取得し、その上でg_file_info_get_sizeを呼び出すことができます。 – sepp2k

-1

私はGTKと、ちょうどあなたのようにnoobのだ(多分それ以上)が、私はC/C++でファイルをダウンロードするには、「1命令」仕方がないと思われます。外部ツール(wgetなど)を使用するか、GETプロシージャを自分で作成する必要があります。 Hereは、libcurlを使用したCでのファイルダウンロードの例です。がんばろう!

+0

正直言って、gtkのドキュメントからは、File Chooser Dialogを除いてファイル処理の例は見当たりませんでした。ローカルファイルを読み込んだだけでも、私は単純にCスタイルのfreadでコーディングしました... – user907810

+0

libcurlを使用する唯一の問題は、 libcurlライブラリもインストールします。実際に私は組み込みARMアプリケーション用にプログラミングしていますが、このライブラリがデフォルトでは使用できない場合は、コンパイルする必要があります。 – user907810

関連する問題