7

GLib/GIO ライブラリを使用して Web からファイルを取得するには、どの関数を使用すればよいですか?

私のファイルが次のものである場合:

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

ダウンロードするにはどうすればよいですか?

ローカル ファイルには、単純に fopen や fread などの C ライブラリを使用します。

上記はどうすればいいですか?

残念ながら、チュートリアルにはファイル処理の例はありません。ファイル ダイアログ ボックスからしかファイル チューザが表示されません。


コメントからの作業コードで更新: 以下のコードは、サイズが不明なバイナリ ファイルに対して機能します。

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

2 に答える 2

11

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

を使用g_file_readして、指定された URI の GFileInputStream をg_data_input_stream_new取得してから、入力ストリームの GDataInputStream を取得できます。これを使用して、ファイルを 1 行ずつ読み取ることができます。GFileInputStream を GInputStream に渡す前にg_data_input_stream_new(またはそれを使って何か他のことを行う前に)、GFileInputStream を GInputStream にアップキャストする必要がありますが、C で GTK をプログラミングしている場合は、おそらくもう慣れているでしょう。

于 2012-05-16T18:29:25.593 に答える
-1

私はGTK(おそらくそれ以上)のあなたと同じように初心者ですが、C /C++でファイルをダウンロードするための「1つの指示」の方法がないのではないかと思います。外部ツール(wgetなど)を使用するか、GETプロシージャを自分で作成する必要があります。これは、libcurlを使用したCでのファイルダウンロードの例です幸運を!

于 2012-05-16T16:40:10.947 に答える