一、前言
cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。
cURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。
curl还支持SSL认证、HTTP POST、HTTP PUT、FTP上传, HTTP form based upload、proxies、HTTP/2、cookies、用户名 密码认证(Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos)、file transfer resume、proxy tunneling。
二、curl下载
curl for windows : https://curl.se/windows/
下载页面如图:
解压后的可执行文件位置:
下面是解压后的文件目录:
在命令行使用curl测试下载文件:
三、通过命令行使用curl
curl可以直接调用函数库完成功能设计、也可以直接调用可执行文件完成需要的功能,下面这里就介绍,在windows下,通过CreateProcess
调用curl命令函数完成文件下载。使用curl实现HTTP协议文件下载成功,通过给定的连接地址,可以完成文件下载,百分比进度返回等等。
/**************************************************
作者: DS小龙哥
功能: 执行命令
参数解释:
CallBackFunction_p func_p :回调函数,用于通知进度执行过程
char *text //进度的转码过程,详细描述.描述当前这个操作是做什么.
char *total_time //执行的总时间
char *cmd //执行的命令
**************************************************/
int file_down_func(CallBackFunction_p func_p, const char *text, const char *total_time, const char *cmd)
{
BOOL run_pipe;
PROCESS_INFORMATION pi;
STARTUPINFO si;
BOOL ret = FALSE;
DWORD flags = CREATE_NO_WINDOW;
char pBuffer[210];
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE hReadPipe, hWritePipe;
run_pipe = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);
if (run_pipe != 1)
{
printf("创建匿名管道文件失败=%dn", run_pipe);
return -1;
}
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags |= STARTF_USESTDHANDLES;
si.hStdInput = NULL;
si.hStdError = hWritePipe;
si.hStdOutput = hWritePipe;
wchar_t cmd_wchar[1024];
CharToWchar(cmd, cmd_wchar);
//TCHAR cmd[] = TEXT("ffmpeg -i D:\123.mp4 -vf reverse D:\out\out1.mp4");
ret = CreateProcess(NULL, cmd_wchar, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);
if (ret)
{
while (true)
{
DWORD ExitCode = 0;
//判断进程是否执行结束
printf("正在执行...GetExitCodeProcessrn");
GetExitCodeProcess(pi.hProcess, &ExitCode);
printf("ExitCode:%drn", ExitCode);
if (ExitCode == STILL_ACTIVE) //正在运行
{
DWORD RSize = 0;
BOOL run_s = 0;
printf("正在执行...ReadFilern");
run_s = ReadFile(hReadPipe, pBuffer, sizeof(pBuffer), &RSize, NULL);
pBuffer[RSize - 1] = '