VC++ FTP文件下传(断点续传)

2023-11-18

#include <WinInet.h>
#pragma comment(lib, "WinInet.lib")
HINTERNET hInternet, hConnect = NULL;

// 建立会话
hInternet = InternetOpen(_T("WinInet Ftp"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0/*INTERNET_FLAG_ASYNC*/);
if (hInternet == nullptr)
	return ;

// 建立连接
hConnect = InternetConnect(hInternet, m_strServer, m_nFtpPort/*INTERNET_INVALID_PORT_NUMBER*/, m_strUsername, m_strPassword,
	INTERNET_SERVICE_FTP, INTERNET_FLAG_EXISTING_CONNECT || INTERNET_FLAG_PASSIVE, 0);
if (hConnect == nullptr)
{
	InternetCloseHandle(hInternet);
	return ;
}

// 获取远程文件大小信息
LARGE_INTEGER liSize = { 0 };
WIN32_FIND_DATA fileData;
std::string sRemoteFilename = "/远程文件名.xxx";
HINTERNET hRemoteFile = FtpFindFirstFile(hConnect, sRemoteFilename.c_str(), &fileData, 0, 0);
if (hRemoteFile == nullptr)
{
	// 服务器不存在该文件
	if (FtpGetFile(hConnect, sRemoteFilename.c_str(), "本地文件名.xxx", FTP_TRANSFER_TYPE_BINARY, 0))
	{
		// 文件下载成功
	}
	else
	{
		// 文件下载失败
	}

	return;
}
else
{
	// 服务器存在该文件,启用断点续传
	liSize.HighPart = fileData.nFileSizeHigh;
	liSize.LowPart = fileData.nFileSizeLow;
	InternetCloseHandle(hRemoteFile);

	// 获取本地文件大小
	DWORD dwSize = 0;
	HANDLE hLocalFile = CreateFile("本地文件名.xxx", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ |
		FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL);
	if (INVALID_HANDLE_VALUE == hLocalFile)
	{
		// 本地文件不存在
		hLocalFile = CreateFile("本地文件名.xxx", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ |
			FILE_SHARE_WRITE, NULL, ALWAYS_CREATE, FILE_ATTRIBUTE_ARCHIVE, NULL);
	}
	else
	{
		// 获取文件大小
		dwSize = GetFileSize(hLocalFile, NULL);
	}
		
	BOOL bUploadOk = FALSE;
	if (dwSize < liSize.QuadPart)
	{
		// 建立数据传输通道
		HINTERNET hRemoteFile = nullptr;
		std::string sCommand = format("REST %d", dwSize);
		BOOL bRet = FtpCommand(hConnect, FALSE, FTP_TRANSFER_TYPE_BINARY, _T("REST 3\r\n"), 0, NULL);

		sCommand = format("APPE %s", sRemoteFilename.c_str());
		bRet = FtpCommand(hConnect, TRUE, FTP_TRANSFER_TYPE_BINARY, sCommand.c_str(), 0, &hRemoteFile);
		if (bRet && hRemoteFile != nullptr)
		{
			// 本地文件大小比远程大,则续传
			SetFilePointer(hLocalFile, dwSize, NULL, FILE_BEGIN);
			while (TRUE)
			{
				char buffer[1024];
				DWORD dwRet = 0;
				if (InternetReadFile(hRemoteFile, buffer, 1024, &dwRet, NULL))
				{
					if (dwRet == 0)
					{
						// 文件读取完毕
						break;
					}

					DWORD dwSize = 0;
					if (!WriteFile(hLocalFile, buffer, dwRet, &dwSize))
					{
						// 写入失败
						break;
					}
				}
				else
				{
					break;
				}
			}

			InternetCloseHandle(hRemoteFile);
		}
		else
		{
			// 远程文件访问失败
			DWORD dwError;
			TCHAR tpszBuff[2 * 1024];
			DWORD dwBuffLen = 2 * 1024;
			bRet = ::InternetGetLastResponseInfo(&dwError, tpszBuff, &dwBuffLen);				
		}
	}

	CloseHandle(hLocalFile);
}

InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VC++ FTP文件下传(断点续传) 的相关文章

  • FTP 数据连接重用

    我正在开发一个 FTP 客户端 并试图了解数据连接的工作流程 据我了解 最初的 command 连接是永久的 直到您退出为止 但是 我不确定数据连接 是否按命令重新启动 所以你打电话PORT or PASV 获得第二个连接 执行LIST 得
  • python 中的一行 ftp 服务器

    python 中是否可以使用一行命令来创建一个简单的 ftp 服务器 我希望能够以快速 临时的方式将文件传输到 Linux 机器 而无需安装 ftp 服务器 最好是使用内置 python 库的方法 这样就不需要安装任何额外的东西 强制性的T
  • 让 FTP 在 Azure VM 上运行,克服 ftp 客户端上的“连接关闭”问题

    我正在努力连接到 Azure 中新 VM 上的 FTP 我从默认映像 Windows Server 2012 Datacenter 创建了一个新的虚拟机 并通过 RDP 连接到新的虚拟机中 然后 我启用了 Web 服务器 IIS 角色 包括
  • 警告:ftp_get():删除操作成功

    我有一些从我们的开发服务器传输备份的代码 它似乎随机表现得非常奇怪 并给出以下错误 输出 Warning ftp get Delete operation successful in root cron get dev archives p
  • 如何使用GVIM编辑远程文件?

    我在 Ubuntu 9 10 上使用 GVIM 我正在寻找正确的方法来配置 GVIM 以便能够通过 ftp 等方式编辑远程文件 HTML PHP CSS 当我使用 e scp username remotehost path to file
  • WinInet如何使用sock代理

    我想使用 WinInet 访问网页 但使用ocks4 socks5 代理 这是我尝试过的 HINTERNET hOpen InternetOpenA helper USER AGENT INTERNET OPEN TYPE PROXY SO
  • 我如何从delphi检索WinInet错误代码的错误描述

    我需要获取 WinInet 函数错误代码的描述 有关 WinInet 函数的 MSDN 文档说明了我必须使用GetLastError http msdn microsoft com en us library ms679360 28VS 8
  • 是否可以通过 FTP 代理使用 C# FtpWebRequest?

    据我了解 FtpWebRequest Proxy属性表示 HTTP 代理 我必须通过 FTP 代理向外部服务器发出 FTP 请求 到目前为止 我实现此功能的唯一方法是创建一个使用 Windows FTP 命令的脚本并以这种方式下载 是否可以
  • FTP 错误 530 用户无法登录

    我正在尝试通过 FTP 访问我使用 Windows Server Web 64 位 版本的 IIS 7 0 设置的新 FTP 站点 但是当我尝试登录该网站时出现上述错误 但我可以登录到我的其他 FTP 站点 另外 当我从 IIS 管理器中选
  • 从 C# 中的服务器下载后,Zip 文件被损坏

    request MakeConnection uri WebRequestMethods Ftp DownloadFile username password response FtpWebResponse request GetRespo
  • 没有人拥有者(99 99)在FTP中由php功能引起?

    我有一个脚本 Joomla 可以在服务器上创建文件和目录 问题是它在所有者 99 99 无人 下创建它们 并且在没有服务器管理员帮助的情况下我无法通过 FTP 删除或修改它们 我认为那是move uploaded filephp 的函数 W
  • Powershell 以块的形式读取文件

    我有一个用 Powershell 编写的脚本 它通过 FTP 传输文件 使用以下命令可以正常工作 content System IO File ReadAllBytes backup app data 但是 一旦文件大小达到 2Gb 此方法
  • 使用PHP通过FTP递归扫描目录和子目录

    我正在尝试创建目录中所有文件 及其大小 的列表 包括子目录中的所有内容 这些文件位于远程服务器上 所以我的脚本通过 FTP 连接 然后使用以下命令运行递归函数ftp chdir浏览每个目录 如果有其他方法可以做到这一点 我愿意接受建议 fl
  • 如何完善这个FTP(shell)功能?

    我有大量使用以下函数的脚本 Copies files over using FTP Configurations set at the beggining of the script param 1 FTP Host 2 FTP User
  • 在VS2008中,对于网站的FTP发布,有没有办法保存FTP登录密码?

    我喜欢 Visual Studio 2008 IDE 集成 非命令行 功能 可以选择通过 FTP 将 ASP NET 网站发布到我的网络服务器 我可以存储我的 FTP 用户名 但没有看到任何存储我的 FTP 密码的选项 因此我每次发布时都必
  • 如何使用java按上次更新时间对SFTP文件进行排序?

    I am having a set of text files in my FTP server 我想阅读今天之前上传的所有文件 其中我必须打印最后三个上传文件的属性 名称 上传时间 大小 现在我将能够打印 FTP 服务器中存在的文件的名称
  • 使用 FtpWebRequest 将文件上传到 FTP 时,远程服务器返回错误:(550)

    I need to upload file via ftp to host The home2 travele2 path created on the root of host 我可以通过 FileZilla 程序将文件上传到主机 但是当
  • Groovy 与 Grape 和 AntBuilder 类加载器问题

    我想使用 groovy 编写一个小 ftp 脚本 并找到了这篇文章http www hhhhq org blog 2009 05 01 ftp using groovy and ant http www hhhhq org blog 200
  • 触发“对等方重置连接”

    我想测试当发生 对等方重置连接 错误时我们的应用程序 嵌入式 ftp 服务器 中发生的日志记录 这个帖子 https stackoverflow com questions 1434451 connection reset by peer很
  • 是否可以使用流上下文在 PHP 下使用 FTPS?

    我了解到使用ftpsPHP for Windows 下的 ftp ssl connect 很困难 您被要求进入构建自己的二进制文件以包括 Open SSL 的漫长旅程 我找到了以下建议phpseclib http phpseclib sou

随机推荐

  • unity shader入门(一) 基本结构和变量声明

    文章目录 前言 Unity中shader相关的结构 什么是openGL和DirectX unity shader的分类 编写一个unity shader shader的基本结构 shader的property类型 在subshader中再次
  • Matlab 高斯信道下QPSK通带通信系统的简单仿真

    1 原理 2 仿真 3 总结反思 4 参考资料 1 原理 QPSK的具体内容请参考百度 QPSK的调制jie框图大致如下 QPSK信号可以采用正交调制的方式产生 如第一张图片的左半部分 I路信号与cos 信号相乘 Q 路信号与sin信号相乘
  • 【知识分享】机器学习的基本流程

    个人理解的机器学习简单流程如下 0 收集数据 1 对数据集进行预处理 2 划分数据集 训练集 测试集 验证集 3 训练 4 验证模型 对每个步骤详细解释 0 收集数据 可以使用之前学过使用爬虫对特定网页内容爬取 或在数据网页等信息网站上直接
  • [error] MFC错误不能将参数1从"const char [3]"转换为"const wchar_t *"

    在做项目中经常遇到很多错误 这里我仅仅把自己遇到的一些错误和解决方法写出 供自己和大家查看 代码如下 CRect rect GetClientRect rect CString str str Format ld rect bottom M
  • OpenCV Error: Assertion failed (type == B.type() && (type == CV_32FC1

    最近切换到64位系统上 运行以前的程序真是各种bug不停啊 主要还是系统位数导致的 先看下面这个错误 OpenCV Error Assertion failed type B type type CV 32FC1 type CV 64FC1
  • 解决ChatGML启动报错:RuntimeError: expected scalar type Half but found Float

    1 编辑web demo2 py文件 2 在原始命令加上 half 原始命令 model AutoModel from pretrained app model chatglm2 6b trust remote code True half
  • 如何优雅地实现 Excel 文件导出功能?(阿里出品的 EasyExcel,安利一波)

    EasyExcel 前言 导出是后台管理系统的常用功能 当数据量特别大的时候会内存溢出和卡顿页面 曾经自己封装过一个导出 POI百万级大数据量EXCEL导出 采用了分批查询数据来避免内存溢出和使用SXSSFWorkbook方式缓存数据到文件
  • 区块链技术详解

    区块链概述 区块链定义 区块链 是一个共享的 不可篡改的账本 旨在促进业务网络中的交易记录和资产跟踪流程 资产 可以是有形的 如房屋 汽车 现金 土地 也可以是无形的 如知识产权 专利 版权 品牌 几乎任何有价值的东西都可以在区块链网络上跟
  • 关于ROM,RAM,FLASH的个人理解

    RAM和ROM是指的存储介质 不是存储器 在硬件构造上不同 所以性质不同 但都是半导体存储介质 RAM是随机存取存储器 随机是什么意思呢 意思是 给定一个地址 可以立即访问到数据 访问时间和位置无关 RAM特点是掉电会丢失数据 但是RAM的
  • docker -toolbox host is not running 最简单解决方案

    很多小伙伴下载toolbox后 用gitbash运行docker machine start 可能会出现 docker host is not running的错误信息 其实我觉得就是无法启用虚拟机服务 打开虚拟机可以看到其实创建的虚拟机是
  • 小米手机安装linux视频教程,屏幕失灵的小米5手机安装linuxdeploy centos7记录

    几年前使用的小米5手机不知道什么时候屏幕失灵了 触摸任何地方都没有反应 幸好下面三个实体按键还是好的 就拿来安装一下linux系统 我到华强北去问了一下 修好屏幕至少需要100多块 这个手机卖旧手机也就是100块 懒得换屏幕盖板了 刚好前段
  • java sqlexception_java.sql.SQLException

    java sql SQLException ResultSet is closed是什么错误 java sql SQLException ResultSetisclosed是什么错误 java sql SQLException Result
  • 项目开发中开发文档出现的问题及其对策

    在常规项目开发管理中 很多项目专家都提出要用各种各样规范的文档对开发工作进行管理 但是在日常工作中 由于这些文档的编写的管理工作都是相当繁重的 以致让一线员工不能主动积极使用 更新这些文档 长期下来 这些管理型的 设计型的文档所发挥的作用就
  • Qt中SQLite3的增、删、改、查操作

    QT sqlite3 先说一下QT自带数据库sqlite3和另外用sqlite3插件的区别 他们的功能是一样的 但是代码就不一样了 QT对数据库具有完善的支持 不需要加任何其他插件就可以直接使用 但是如果你要是加了sqlite3插件 调用数
  • 解决: Message: invalid selector: Compound class names not permitted报错的问题

    对于出现消息 无效的选择器 不允许使用复合类名的问题 该页面解析 原始代码 self driver find element by class name s btn btn ok click 问题 代码出现如下清空 Traceback mo
  • Java Swing基础(层次结构,组件,布局管理)

    Swing基础层次结构 图形环境和图形对象 坐标 GUI组件的左上角坐标默认为 0 0 从左上角到右下角 水平坐标x和垂直坐标y增加 坐标的单位是像素 Graphics对象 专门管理图形环境 Graphics类是一个抽象类 抽象类Graph
  • 前端调试知识, 各种调试姿势

    在日常开发过程中 如果我们的程序出问题了 要找出是哪里导致的问题的时候 往往会遇到一个变量在10多20多个地方被改变了 然后找不到时哪一次的改变导致的异常 笨的方法也有 就是每一个有可能改到的地方都加上一个console log 通过log
  • 揭示网络通信的秘密:协议与套接字编程之旅

    文章目录 探索网络编程的魔法世界 网络编程 网络编程的基本概念 网络通信协议 套接字编程 网络编程的实际应用 总结 个人主页 程序员 小侯 CSDN新晋作者 欢迎 点赞 评论 收藏 收录专栏 Java知识介绍 文章内容 网络编程 适用于 J
  • STM32的CAN标识符过滤器超简单理解

    1 STM32中CAN1与CAN2的过滤器组 103系列14个过滤器组 104 107系列28个过滤器组 CAN FilterInitStructure CAN FilterNumber 0 0 13 2 每组过滤器组有两种工作模式 标识符
  • VC++ FTP文件下传(断点续传)

    include