2012-05-16 5 views
5

gtk 라이브러리를 사용하여 웹에서 파일을 가져와야하는 기능은 무엇입니까?웹에서 파일 가져 오기 : C를 사용하여 GTK에서

내 파일에서 인 경우 :

gchar의 * 경로 = "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

CURL이 작업을 수행 할 수 있습니다. – nullpotent

+0

더러운 해킹은 어떨까요? int meh = system ("wget"+ name); – Mikhail

답변

11

HTTP는 GIO에서 지원하는 프로토콜 중 하나이므로 표준 C 기능 대신 GIO 기능을 사용할 때 다른 파일과 마찬가지로 HTTP URI를 열 수 있습니다. g_file_new_for_uri을 사용하여 파일 객체를 만든 다음 로컬 파일처럼 읽을 수 있습니다.

g_file_read을 사용하면 지정된 URI에 대한 GFileInputStream을 가져오고 g_data_input_stream_new을 사용하여 입력 스트림에 대한 GDataInputStream을 가져올 수 있습니다. 그런 다음 입력 스트림을 통해 파일을 한 줄씩 읽을 수 있습니다. g_data_input_stream_new에 전달하기 전에 GFileInputStream을 GInputStream으로 업 캐스팅해야합니다 (또는 다른 유용한 기능을 수행하기 전에).하지만 GTK를 C로 프로그래밍하는 경우에는 지금까지 익숙 할 것입니다.

+0

감사합니다. sepp2k. 한번 시도해 보도록하겠습니다. – user907810

+0

읽기에 적합한 버퍼를 할당하기 전에 파일의 크기를 미리 얻으려면 어떻게해야합니까? C에서는 fseek와 ftell을 사용하여이 작업을 수행했습니다. GTK에서 가능합니까? – user907810

+0

@ user907810 파일 객체에서 GFileInfo 객체를 가져온 다음 g_file_info_get_size를 호출 할 수 있습니다. – sepp2k

-1

나는 멍청한 놈이야 그냥 GTK와 (어쩌면 더)하지만 난 C/C++에서 파일을 다운로드 할 수있는 "한 명령"방법이 아니라고 생각으로. 외부 도구 (wget 등)를 사용하거나 직접 GET 절차를 작성해야합니다. Here은 libcurl을 사용하여 C에서 파일을 다운로드하는 예제입니다. 행운을 빕니다!

+0

솔직히 말해서, gtk 문서에서 파일 선택기 대화 상자를 제외하고 파일 처리의 예제를 보지 못했습니다. 따라서 로컬 파일을 읽는 경우에도 C 스타일의 fread로 간단히 코드화했습니다. – user907810

+0

libcurl을 사용할 때의 유일한 문제점은 다음과 같습니다. libcurl 라이브러리도 설치하십시오. 사실 임베디드 ARM 응용 프로그램 용으로 프로그래밍 중이며,이 lib를 기본적으로 사용할 수 없다면 컴파일을해야합니다. – user907810

관련 문제