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、解压后得到一个文件夹“libcurl-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\”根据你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,据说将.dll放到C盘System32文件夹里可以一劳永逸,不用每次新建工程都要拷贝.dll到Debug下,不过有待考证,我没试过。

6、关于libsasl.dll:此时运行可能会提示你缺少libsasl.dll,这个dll下载的curl里是没有的,可以从网上下一个,然后和其他的.dll一样放到Debug目录下,最后编译就可以运行了

7、获取ftp文件的示例:这里是一份获取FTP服务器文件的示例代码,可以测试curl是否配置成功(前提是你要有个FTP服务器,如果你没有,但是想搭建一个简单的FTP服务器,请看这里

要修改"ftp://192.168.1.101/sc.jpg"和"username:userpassword"两个参数,这分别对应着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;
}

C++ 下使用curl 获取ftp文件

时间: 06-07

C++ 下使用curl 获取ftp文件的相关文章

windows下使用curl下载ftp文件(ftp有密码)

curl下载地址:http://curl.haxx.se/download.html 如下是bat脚本--------- @echo off echo %date% set Now=%date:~0,4%%date:~5,2%%date:~8,2% echo %Now% set filename=abc-%Now%.zip echo %filename% echo curl.exe ftp://www.baidu.com:222/%filename% -u user:password -o c:

FtpHelper类匿名获取FTP文件

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Windows.Forms; using Test; namespace Test { public class FtpHelper { //基本设置 static private string path = @"ftp://&qu

打印 上一主题 下一主题 利用cURL实现单个文件分多段同时下载,支持断点续传(修订版)

  利用cURL实现单个文件分多段同时下载,支持断点续传(修订版) [复制链接] 摘自 http://bbs.chinaunix.net/thread-917952-1-1.html 在ubuntu下测试通过, 适合在支持多线程下载的站点下载文件 可以配合flashgot在firefox中使用 用法:./mycurl url [referedUrl] 第一个参数url是要下载的文件的地址,第二个参数referedUrl是指需要参照的网址(一般不需要,有些网站,比如华军需要此参数) 例如: ./m

thinkphp5获取ftp上的文件列表

引入ftp类 <?php /** * 仿写CodeIgniter的FTP类 * FTP基本操作: * 1) 登陆; connect * 2) 当前目录文件列表; filelist * 3) 目录改变; chgdir * * @author quanshuidingdang */ class Ftp { private $hostname = ''; private $username = ''; private $password = ''; private $port = 21; privat

获取某文件夹下所有文件名、文件夹名、后缀名

今天在提交github时,突然觉得提交得很慢,想到github允许设置.gitignore文件进行某些后缀名的忽略,于是乎决定好好设置一下.gitimnore. 于是乎....我发现,一个很大的项目,或者一个很杂乱的文件库,很难知道这里面到底存在哪些后缀名的文件,一个文件夹一个文件夹的找又太慢,而且容易出错. 于是乎....我开始敲代码了,顺带着把获取某文件夹下所有文件名.文件夹名.后缀名这三个功能一起实现了. [来看效果] 不输入参数时或者第一个参数输入"\"时,默认为当前目录,显示

VBA获取某文件夹下所有文件和子文件目录的文件

<strong>VBA获取某文件夹下所有文件,或子文件目录的文件</strong> '------------------------------------------- '获取某文件夹下的所有Excel文件 '------------------------------------------- Sub getExcelFile(sFolderPath As String) On Error Resume Next Dim f As String Dim file() As S

python2.7之获取某个文件下文件名

def file_name(file_dir): """ 获取文件夹下面的pdf文件——第一个for循环 获取得到的pdf文件包含“-Y”的文件——第二个for循环 :param file_dir: :return: """ file_name=[] for files in os.listdir(unicode(file_dir,'utf-8')): if os.path.splitext(files)[1]=='.pdf': file_nam

python 获取当前文件夹下所有文件名

os 模块下有两个函数: os.walk() os.listdir() 1 # -*- coding: utf-8 -*- 2 3 import os 4 5 def file_name(file_dir): 6 for root, dirs, files in os.walk(file_dir): 7 print(root) #当前目录路径 8 print(dirs) #当前路径下所有子目录 9 print(files) #当前路径下所有非目录子文件 1 # -*- coding: utf-8

windows下使用curl命令 &amp;&amp; 常用curl命令

什么是curl命令? curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本. 如何在windows下使用curl命令? 第一步: 进入curl下载官网,下载合适的版本,我这里下载的是windows 64位的curl. 其中我下载的zip文件.  另外CAB文件也是压缩文件,这是微软出品,不太好用,建议使用zip压缩文件. 第二步: 解压缩文件,然后找到该文件目录下的bin子文件(bin即二进