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文件的更多相关文章
- c#FTP操作类,包含上传,下载,删除,获取FTP文件列表文件夹等Hhelp类
有些时间没发表文章了,之前用到过,这是我总结出来关于ftp相关操作一些方法,网上也有很多,但是没有那么全面,我的这些仅供参考和借鉴,希望能够帮助到大家,代码和相关引用我都复制粘贴出来了,希望大家喜欢 ...
- IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案
上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...
- curl获取远程文件内容
curl获取远程文件内容 ** 获取远程文件内容 @param $url 文件http地址 * function fopen_url($url) { if (function_exists(& ...
- Mac OS 终端下使用 Curl 命令下载文件
在 mac os下,如何通过命令行来下载网络文件?如果你没有安装或 wget 命令,那么可以使用 curl 工具来达到我们的目的. curl命令参数: curl 'url地址' curl [选项] ' ...
- FtpHelper类匿名获取FTP文件
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...
- Linux基础命令---get获取ftp文件
get 使用lftp登录ftp服务器之后,可以使用get指令从服务器获取文件. 1.语法 get [-E] [-a] [-c] [-O base] rfile [-o lfil ...
- Linux基础命令---mget获取ftp文件
mget 使用lftp登录mftp服务器之后,可以使用mget指令从服务器获取文件.mget指令可以使用通配符,而get指令则不可以. 1.语法 mget [-E] [-a] [- ...
- C#获取FTP文件详细备注信息
private void button1_Click(object sender, RoutedEventArgs e) { Uri uri = new Uri("ftp://192.168 ...
- 解决在Ubuntu终端下使用cURL获取GBK格式的页面出现乱码问题
问题描述 在Ubuntu下使用终端使用cURL去拿一个GBK的页面,发现返回来的内容里面中文都是乱码 解决方法 通过iconv来处理乱码拿到的内容,进行转码,示例如下: $curl http://ww ...
随机推荐
- hdu 1237 简单计算器(栈处理)
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- maven-javadoc-plugin
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javad ...
- PIE SDK地图放大镜
放大镜,在地图的浏览过程中在主地图和次地图中起到很好的辅助作用, 要实现放大镜功能主要就是通过两个mapControl控件,主地图控件是mapControlMain,放大镜控件是UserControl ...
- vm12下Centos6安装mysql5.7
一.下载mysql的rpm tar文件 文件名称:mysql-5.7.18-1.el6.x86_64.rpm-bundle.tar官方地址:https://dev.mysql.com/get/Down ...
- html5使用local storage存储的数据在本地是以何种形式保存的
html5使用local storage存储的数据是如何保存在本地的?(我使用的是chrome浏览器,chrom浏览器是用sqlite来保存本地数据的) Html5 的local storage 是通 ...
- Linux下jenkins改端口、解决内存溢出、版本升级
1.新版本的jenkins修改端口新版本jenkins的配置文件在/etc/sysconfig/jenkinsvi /etc/sysconfig/jenkins找到JENKINS_PORT=" ...
- k8s单节点集群部署应用
之所以用k8s来部署应用,就是因为k8s可以灵活的控制集群规模,进行扩充或者收缩.生产上我们要配置的参数较多,命令行的方式显然不能满足需求,我们应该使用基于配置文件的方式.接下来做一个部署的demo: ...
- HttpServlet的请求转发理解
一个http请求的流转,其实主要涉及到五部分的内容,第一部分就是request所包含的参数,也就是request.getAttribute能获取的东西:第二部分是request所携带的内容实体,这部分 ...
- 为什么一段时间后网站后台自动退出 php中session过期时间设置
修改php配置文件中的session.gc_maxlifetime.如果想了解更多session回收机制,继续阅读.(本文环境php5.2) 概述:每一次php请求,会有1/100的概率(默认值)触发 ...
- centos6.5下搭建oracle 11g
1.安装依赖 sudo yum install binutils compat-libstdc++-33 compat-libstdc++-33.i686 elfutils-libelf elfuti ...