Avatar billede thecokeguy Nybegynder
16. juni 2010 - 09:21 Der er 10 kommentarer

Kan man lukke en fil for hurtigt?

Jeg har lavet et lille program der via libcurl henter en billedefil fra en server og gemmer den på harddisken. Det mærkelige er bare at hvis jeg bare kører programmet, så mangler der ofte ca. halvdelen af miniaturebilledet i stifinder (resten er bare gråt), men hvis jeg indsætter Sleep(1000), lige før jeg lukker filen, så er alt med hver gang. Hvilket får mig til at tænke på, kan man lukke en fil så hurtigt at man ikke får det sidste med? Bør man kontrollere at det hele er med, før lukning? I så fald hvordan?

På forhånd tak for hjælpen
Avatar billede arne_v Ekspert
16. juni 2010 - 15:07 #1
Maa vi se lidt kode?
Avatar billede thecokeguy Nybegynder
16. juni 2010 - 15:33 #2
Det kan du tro i må... Ville bare ikke besværliggøre hvad jeg troede var trivielt.

CURL *curl;
FILE *fp;
CURLcode res;
char* dir = "C:\\users\\nicolaj andersen\\desktop\\";

curl = curl_easy_init();

if (curl) {
    char* url = "http://www.domain.com/image.jpg";
    char* filename = extract_filename(url, EF_URL);
    char* filepath = append_strings(dir, filename);
    fp = fopen(filepath, "wb");
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
    res = curl_easy_perform(curl);

    Sleep(1000); //proper file close?
    fclose(fp);

    printf("File [%s] successfully downloaded.\n", filename);

    curl_easy_cleanup(curl);
}

...Uden Sleep, er det ofte den ikke får alt med.
Avatar billede thecokeguy Nybegynder
16. juni 2010 - 15:33 #3
Det kan du tro i må... Ville bare ikke besværliggøre hvad jeg troede var trivielt.

CURL *curl;
FILE *fp;
CURLcode res;
char* dir = "C:\\users\\nicolaj andersen\\desktop\\";

curl = curl_easy_init();

if (curl) {
    char* url = "http://www.domain.com/image.jpg";
    char* filename = extract_filename(url, EF_URL);
    char* filepath = append_strings(dir, filename);
    fp = fopen(filepath, "wb");
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
    res = curl_easy_perform(curl);

    Sleep(1000); //proper file close?
    fclose(fp);

    printf("File [%s] successfully downloaded.\n", filename);

    curl_easy_cleanup(curl);
}

...Uden Sleep, er det ofte den ikke får alt med.
Avatar billede thecokeguy Nybegynder
16. juni 2010 - 15:35 #4
Undskyld dobbeltpost... Troede ikke den havde postet den.
Avatar billede arne_v Ekspert
16. juni 2010 - 15:44 #5
Jeg tror at curl_easy_perform er asynkron d.v.s. at den laver download i baggrunden mens dit program koerer viderer.

Enten skal du finde en maade at vente indtil curl_easy_perform er faerdig eller saa skal du bruge ene anden funktion.
Avatar billede thecokeguy Nybegynder
16. juni 2010 - 16:00 #6
Det var også en af de tanker jeg havde... Men så burde den jo knap gå i gang før programmet lukker? Fandt også:
http://curl.haxx.se/mail/lib-2010-01/0112.html
...hvor jeg læser sidste svar som at denne metode ikke er asynkron. Men jeg kan da tage fejl.
Avatar billede segmose Nybegynder
17. juni 2010 - 14:40 #7
Du checker ikke hvad res har af værdi.
Prøve at flyt fclose ned efter curl_easy_cleanup
Det ser ud til at det er muligt at sætte en progress callback op, prøv det og se om den er færdig inden du fclose'r
Avatar billede segmose Nybegynder
17. juni 2010 - 14:41 #8
Hvis ingen af dem virker så hvordan ser din write_data ud?
Avatar billede thecokeguy Nybegynder
17. juni 2010 - 15:47 #9
Ingen af forslagene løste problemet, hvilket fik mig til at tænke på om Windows måske lavede problemerne. Hvis jeg går ind og sletter miniature cachen og åbner mappen igen så er problemet løst. Hvilket bringer mig til noget andet... Kan man få Windows til at opdatere dette med et systemkald?
Avatar billede segmose Nybegynder
18. juni 2010 - 09:04 #10
Jeg kan ikke få min Vista til at opdatere størrelsen på visse filer ved at trykke F5 men når jeg åbner dem har de et større indhold, så det gælder måske også billeder.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester