2011-06-20 13 views
10

Muszę przesłać katalogi na serwer FTP w mojej aplikacji i zaplanować na użycie libcurl. Widzę, że nie ma bezpośredniego sposobu na przesłanie katalogu z wieloma plikami , co ma dla mnie sens. Nie mogłem jednak znaleźć żadnej wzmianki na temat przesyłania wielu plików przez .libcurl - Zachowaj połączenie "otwarte", aby przesłać wiele plików (FTP)

Jeśli otrzymam listę plików w katalogu, mogę przesłać je w pętli. Opcja CURLOPT_FTP_CREATE_MISSING_DIRS może pomóc w podkatalogach, , ale jeśli chciałbym wiedzieć również, jeśli brakuje mi tu punktu lub miałoby to poważną wadę.

Główne pytanie brzmi: jak mogę utrzymać połączenie "otwarte"? Ponowne połączenie na każdego pliku prawdopodobnie oznaczałoby dodatkowe niechciane obciążenie.

Idealnie, chciałbym dalej używać łatwego interfejsu. Ale jeśli inny interfejs zapewnia lepsze wsparcie w tym przypadku, użyję go.

CURLcode ret; 
CURL *handle = curl_easy_init(); 

/* Connect to FTP server using  * 
* the given username and password */ 

for ({each file}) { 

    curl_easy_setopt(handle, ..., ...); 
    ... 
    ret = curl_easy_perform(handle); 
    /* Analyse return code */ 
    curl_easy_reset(handle); 
} 

/* Disconnect from server */ 
curl_easy_clenup(handle); 

Odpowiedz

12

Wystarczy ponownie użyć tego samego uchwytu, i będzie utrzymywać połączenie otwarte tak bardzo, jak to możliwe, a kolejne przelewy będą ponownie używane poprzedniej.

Podczas korzystania z łatwego interfejsu pamięć podręczna połączeń jest przechowywana w łatwym do obsługi uchwycie. Jeśli zamiast tego korzystasz z interfejsu multi, pamięć podręczna połączeń będzie przechowywana w obrębie multi-handle i będzie udostępniana wszystkim łatwym uchwytom używanym w tym samym multi-handle.

+0

Wielkie dzięki, panie Stenberg, jak bardzo cieszę się z otrzymanej od Ciebie odpowiedzi! Jeśli mogę poprosić o dalsze wyjaśnienia, czy w tym przypadku będzie potrzebne 'curl_easy_reset()'? Strona podręcznika mówi, że połączenia na żywo są przechowywane w uchwycie, jednak czy ponowne ustawienie opcji ręcznie (w pętli) będzie wystarczające? – sidyll

+0

Możesz zrobić w dowolny sposób, który według Ciebie najlepiej pasuje do Twojego kodu. Reset nie zabije pamięci podręcznej połączeń. Jeśli wolisz, możesz ponownie ustawić opcje ręcznie. –

+0

Jeszcze raz dziękuję i gratuluję niesamowitej pracy. Najlepsze życzenia – sidyll

Powiązane problemy