C++ 下使用curl 获取ftp文件
從http://curl.haxx.se/下載的win32版本的curl都不能使,#include <curl.h>后總是報錯:external symbol ,意思就是沒有鏈接到curl的各種library,最后嘗試了n多次終于成功了,希望大家以后少走彎路!
以Windows 8 64bit,Visual Studio 2012 為例:
1、獲取curl:
從這里可以獲得所有版本的curl,我下載的是Win32 - MSVC版本的curl,我下載的是MSVC 7.19.3 devl SSL 版本,可以從這里下載。
2、解壓后得到一個文件夾“l(fā)ibcurl-7.19.3-win32-ssl-msvc”,可以看到里面有include文件夾和lib文件夾
3、添加引用:用Visual Studio打開你的C++工程,選擇Project ->project name Properties -> Configuration Properties -> VC++ Dicrectories 在右側的Include Directories添加“libcurl-7.19.3-win32-ssl-msvc\include”的絕對路徑,如:“X:\a\b\c\libcurl-7.19.3-win32-ssl-msvc\include”,其中“X:\a\b\c\”根據(jù)你curl解壓到的地方不同,要有所變動。
同理,將“libcurl-7.19.3-win32-ssl-msvc\lib\debug”的絕對路徑添加到Libraries Directories中,注意libcurl-7.19.3-win32-ssl-msvc\lib文件夾中包含debug和release兩個文件夾,這里之所以添加debug文件夾是因為筆者當前vs的編譯模式是debug的,如果你當前的編譯模式是release的,那么請將libcurl-7.19.3-win32-ssl-msvc\lib\release文件夾添加到這里,而不要添加debug。
注:在哪種編譯模式下就添加哪個文件夾!要把絕對路徑寫上,而不是相對路徑!如果你不知道什么是絕對路徑,請看這里。
4、添加lib:選擇左側的Configuration Properties ->?Linker -> Input 將Additional Dependencies中加入:
curllib.lib和curllib_static.lib這兩個,然后保存
5、拷貝dll:將libcurl-7.19.3-win32-ssl-msvc文件夾下所有的.dll文件拷到VS工程目錄下的Debug文件夾中。注意,這里之所以拷到VS工程Debug文件夾中,是因為VS編譯后的.exe運行時侯會尋找.dll,如果不放過來就該提示有錯誤了。另外,VS 2012 編譯后可能會生成2個或2個以上的Debug文件夾,但只有一個Debug里有編譯后生成的.exe文件,要放到這個Debug里,不要放錯。PS,據(jù)說將.dll放到C盤System32文件夾里可以一勞永逸,不用每次新建工程都要拷貝.dll到Debug下,不過有待考證,我沒試過。
6、關于libsasl.dll:此時運行可能會提示你缺少libsasl.dll,這個dll下載的curl里是沒有的,可以從網(wǎng)上下一個,然后和其他的.dll一樣放到Debug目錄下,最后編譯就可以運行了
7、獲取ftp文件的示例:這里是一份獲取FTP服務器文件的示例代碼,可以測試curl是否配置成功(前提是你要有個FTP服務器,如果你沒有,但是想搭建一個簡單的FTP服務器,請看這里)
要修改"ftp://192.168.1.101/sc.jpg"和"username:userpassword"兩個參數(shù),這分別對應著FTP服務器上文件的地址,和FTP服務器的用戶名和密碼,注意用戶名和密碼中間有個冒號分隔。
8、Good luck!
#include <string> #include <iostream> #include <fstream> #include <stdio.h> #include <curl\curl.h> #include <stdio.h> using namespace std;struct FtpFile {const char *filename;FILE *stream; };static size_t FetchFiles(void *buffer, size_t size, size_t nmemb, void *stream) {struct FtpFile *out = (struct FtpFile *)stream;if (out && !out->stream) {// open file for writing out->stream = fopen(out->filename, "wb");if (!out->stream)return -1; // failure, can't open file to write}return fwrite(buffer, size, nmemb, out->stream); }int DownloadFtpFile() {CURL *curl;CURLcode res;struct FtpFile ftpfile = {"a.jpg", // name to store the file as if succesful//NULL};curl_global_init(CURL_GLOBAL_DEFAULT);curl = curl_easy_init();if (curl) {curl_easy_setopt(curl, CURLOPT_URL,"ftp://192.168.1.101/sc.jpg");curl_easy_setopt(curl, CURLOPT_USERPWD, "username:userpassword");// Define our callback to get called when there's data to be written //curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, FetchFiles);// Set a pointer to our struct to pass to the callback //curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);// Switch on full protocol/debug output //curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);res = curl_easy_perform(curl);// always cleanup curl_easy_cleanup(curl);if (CURLE_OK != res) {//we failed fprintf(stderr, "curl told us %d\n", res);}}if (ftpfile.stream)fclose(ftpfile.stream); // close the local file curl_global_cleanup();getchar();return 0; }int main(void) {DownloadFtpFile();return 0; }
轉載于:https://www.cnblogs.com/exlsunshine/p/3775074.html
總結
以上是生活随笔為你收集整理的C++ 下使用curl 获取ftp文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS3 Transitions 你可能
- 下一篇: 6月8号=》105页-110页