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

2023-11-19

#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, "192.168.1.8", 21/*INTERNET_INVALID_PORT_NUMBER*/, "admin", "password",
	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 (FtpPutFile(hConnect, "本地文件名.xxx", sRemoteFilename.c_str(), FTP_TRANSFER_TYPE_BINARY, 0))
	{
		// 文件上传成功
	}
	else
	{
		// 文件上传失败
	}
}
else
{
	// 服务器存在该文件,启用断点续传
	liSize.HighPart = fileData.nFileSizeHigh;
	liSize.LowPart = fileData.nFileSizeLow;
	InternetCloseHandle(hRemoteFile);

	// 获取本地文件大小
	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)
	{
		// 获取文件大小
		DWORD dwSize = GetFileSize(hLocalFile, NULL);
		BOOL bUploadOk = FALSE;
		if (dwSize > liSize.QuadPart)
		{
			// 建立数据传输通道
			HINTERNET hRemoteFile = nullptr;
			std::string sCommand = format("REST %d", liSize.QuadPart);
			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, liSize.QuadPart, NULL, FILE_BEGIN);
				while (TRUE)
				{
					char buffer[1024];
					DWORD dwRet = 0;
					if (ReadFile(hLocalFile, buffer, 1024, &dwRet, NULL))
					{
						if (dwRet == 0)
						{
							// 文件发送完毕
							break;
						}

						DWORD dwSize = 0;
						if (!InternetWriteFile(hRemoteFile, 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);
	}
	else
	{
		// 本地文件打开失败
	}
}

InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);

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

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

  • 使用Java通过FTP将所有目录复制到服务器

    我需要将一个目录从本地磁盘复制到服务器 该目录包含很多目录 子目录和文件 想想目录的层次结构树 以下是复制一个文件的示例 public void saveFilesToServer throws IOException FTPClient
  • 如何编写FTP上传和下载脚本

    我正在尝试制作一个批处理文件来将文件上传到 FTP 服务器 如果我手动输入它 它可以正常工作 但是当我运行批处理文件时 它会在连接后停止 它说 connected to domain com 220 microsoft ftp server
  • Ftp 仅在 .NET 4.0 中抛出 WebException

    我有以下 C 代码 当针对 NET Framework 3 5 或 2 0 编译时 它运行得很好 我没有针对 3 0 进行测试 但它很可能也能工作 问题是 当针对 NET Framework 4 0 构建时它会失败 FtpWebReques
  • FtpWebRequest ListDirectory 不返回所有文件

    我正在尝试从包含大约 9000 个文件的 FTP 位置检索文件列表 但下面的代码总是只给出 97 个文件 在第 98 个文件的循环开始时 StreamReader Peek 变为 1 输出 test txt 始终仅包含前 97 个文件 就像
  • 警告:ftp_get():删除操作成功

    我有一些从我们的开发服务器传输备份的代码 它似乎随机表现得非常奇怪 并给出以下错误 输出 Warning ftp get Delete operation successful in root cron get dev archives p
  • 将文件直接从 FTP 传输到 Azure 文件存储,无需将它们保存在本地内存或磁盘中

    我必须将文件从 FTP 传输到 Azure 文件存储 我的代码工作正常 但我正在内存中传输这些文件 这不是最佳实践 所以首先我将流读取到Byte内存中的数组 然后我将输出上传到 Azure 文件存储 现在我知道最好异步执行此操作 但我不知道
  • 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
  • Wordpress 插件安装 - 无法连接到 FTP 服务器 - 最安全的解决方案?

    我成功使用 Wordpress 设置了 VPS LEMP 堆栈 当我尝试从 WP 后端安装插件时 系统会提示以下消息 To perform the requested action WordPress needs to access you
  • 检查 FTP 服务器上的可用空间

    我正在运行一个构建脚本 其中三个可执行文件 每个 100mb 被上传到 FTP 服务器 由于 FTP 服务器空间问题 第一次上传可能会失败 因此我们的构建过程会失败 这意味着我必须从服务器释放一些空间并再次运行构建脚本 这是浪费时间 我想在
  • Python ftplib 损坏文件?

    我正在使用 ftplib 在 Python 中下载文件 直到最近一切似乎都工作正常 我正在下载这样的文件 ftpSession ftplib FTP host username password ftpSession cwd rlmfile
  • php ftp 建立多个目录

    这是我的 PHP 代码 它实际上工作得很好 newftpdir parent date Ymd YYYYMMDD newftpdir child ext folder username newftpdir newftpdir parent
  • Java:从 FTP 服务器访问文件

    我有一个 FTP 服务器 里面有一堆文件夹和文件 我的程序需要访问该服务器 读取所有文件并显示它们的数据 出于开发目的 我一直在使用硬盘驱动器上 src 文件夹中的文件 但现在服务器已启动并运行 我需要将软件连接到它 基本上我想要做的是获取
  • Curl 同时下载和上传同一文件

    不确定是否可能 但我一直在尝试使用curl 从 HTTP 位置下载文件并将其输出到 FTP 服务器上 如果这实际上可能的话 我真的很希望得到一些帮助 curl http example com down curl T ftp mysite
  • 从 C# 中的服务器下载后,Zip 文件被损坏

    request MakeConnection uri WebRequestMethods Ftp DownloadFile username password response FtpWebResponse request GetRespo
  • 如何使用 FTP 在目录之间移动文件?

    我有一个程序需要将文件从 FTP 服务器上的一个目录移动到另一个目录 例如 该文件位于 ftp 1 1 1 1 MAIN Dir1 我需要将文件移动到 ftp 1 1 1 1 MAIN Dir2 我发现了几篇推荐使用 重命名 命令的文章 因
  • Twisted、FTP 和“流式传输”大文件

    我正在尝试实现最能描述为 HTTP API 的 FTP 接口 的内容 本质上 有一个现有的 REST API 可用于管理站点的用户文件 并且我正在构建一个中介服务器 将该 API 重新公开为 FTP 服务器 因此 您可以使用 Filezil
  • Powershell 以块的形式读取文件

    我有一个用 Powershell 编写的脚本 它通过 FTP 传输文件 使用以下命令可以正常工作 content System IO File ReadAllBytes backup app data 但是 一旦文件大小达到 2Gb 此方法
  • 如何完善这个FTP(shell)功能?

    我有大量使用以下函数的脚本 Copies files over using FTP Configurations set at the beggining of the script param 1 FTP Host 2 FTP User
  • 使用 Python 连接从 FTP 检索文件

    我构建了这个简单的工具来暴力破解并连接到 ftp 服务器 import socket import ftplib from ftplib import FTP port 21 ip 192 168 1 108 file1 passwords

随机推荐

  • 【小程序】使用wxParse解析html

    小程序在开发时 读取到服务器的内容是html格式的 因小程序不支持html格式的内容显示的 因此要对html格式的内容进行编译 可以通过wxParse来实现 wxParse下载地址 实现方法 将下载下来的wxParse文件夹复制到开发项目的
  • Unity(纯C语言单元测试框架!不是那个Unity3d)入门文档

    译者注 译者博客 http blog csdn net lin strong 转载请保留这条 此为Unity手册的翻译 仅供学习交流使用 请勿用于商业用途 翻译的资料是公开的 在docs UnityGettingStartedGuide m
  • 计算员工工资

    请编写一个程序 可以读取一名员工的员工编号 本月工作总时长 小时 以及时薪 并输出他的工资条 工资条中包括员工编号和员工月收入 输入格式 输入包含两个整数和一个浮点数 分别代表员工编号 工作时长以及时薪 每个数占一行 输出格式 输出共两行
  • Unreal Engine4蓝图编程学习(一)

    学习内容主要介绍了蓝图进行对象交互 升级玩家技能 升级AI敌人 跟踪游戏状态完成游戏体验等内容 内容来源于 Unreal Engine4蓝图可视化编程 书籍为2017年 与现在版本有一定区别 一 制作移动标靶 1 1 首先 我们想先创建一个
  • mysql database uri,未设置SQLALCHEMY_DATABASE_URI

    I tried to work with CURD operation using Flask and SQLAlchemy But getting Error while connecting to database Here is th
  • springboot+vue教室图书馆预约管理系统、

    下载地址 https download csdn net download ouyangxiaobai123 22176771 项目介绍 springboot vue教室图书馆预约管理系统 系统说明 聪慧物联网教室预定系统 后台系统 项目简
  • 多维数组变成一维数组

    这个问题来源于一个朋友曾经问过我的问题 当时是一个二维数组变成一维数组 后面我想整理一下 整理一个多维 并且是不定维的数组 一 二维数组变成一维数组 1 遍历数组 将元素一个个放入新数组 结果 如果元素不是数组 将会报错 下面是改良版 这样
  • 信号量和自旋锁

    信号量和自旋锁 为了避免并发 防止竞争 内核提供了一组同步方法来提供对共享数据的保护 我们的重点不是介绍这些方法的详细用法 而是强调为什么使用这些方法和它们之间的差别 Linux 使用的同步机制可以说从2 0到2 6以来不断发展完善 从最初
  • python编程实验,模拟聪明版的尼姆游戏设计原理

    实验原理与内容 本实验完成一个模拟聪明版的尼姆游戏功能 尼姆游戏是个著名的游戏 有很多变种玩法 两个玩家轮流从一堆物品中拿走一部分 在每一步中 玩家可以自由选择拿走多少物品 但是必须至少拿走一个并且最多只能拿走一半物品 然后轮到下一个玩家
  • Python SQLAlchemy ( ORM )、dictalchemy、Flask-SQLAlchemy、Flask-migrate、flask-script、flask-upload

    From Python中强大的通用ORM框架 SQLAlchemy https zhuanlan zhihu com p 444930067 Python ORM之SQLAlchemy全面指南 https zhuanlan zhihu co
  • ubuntu 18.04安装wireshark及网卡接口权限问题

    1 安装 sudo apt fast install wireshark 第一次安装过程中可能会提示Should non superusers be able to capture packets 选是即可 默认是否 2 待安装成功后 你会
  • MFC 菜单栏的使用

    MFC 菜单栏的使用 主要介绍两种比较简单和常用的创建方法 一 在资源视图中添加菜单资源 通过鼠标点击添加菜单项 菜单栏设计好 以后就是添加了 介绍两种方法 1 很简单 鼠标右击想显示菜单栏的对话框属性 可以看到有一个menu的属性 点击就
  • Linux 宝塔面板的安装

    Ptw cwl 登录宝塔官网 查看宝塔的详情 www bt cn 安装 linux服务器图形化界面管理器 安装 宝塔面板 在xshell当中执行宝塔面板的安装命令 yum install y wget wget O install sh h
  • python批量处理

    python opencv图像二值化批量处理 from skimage import data dir io transform color filters import numpy as np import cv2 def convert
  • 红帽Redhat—Linux网卡聚合

    文章目录 一 实验环境设置 二 网卡聚合nmcli 配置步骤 1 创建聚合接口 2 配置网络属性 3 添加物理接口 4 激活端口 5 查看聚合接口状态 一 实验环境设置 在已经安装好的RHEL8 3添加两个新网卡 1 点击虚拟机 gt 设置
  • 机器学习笔记----Fuzzy c-means(FCM)模糊聚类详解及matlab实现

    前言 这几天一直都在研究模糊聚类 感觉网上的文档都没有一个详细而具体的讲解 正好今天有时间 就来聊一聊模糊聚类 一 模糊数学 我们大家都知道计算机其实只认识两个数字0 1 我们平时写程序其实也是这样if 1 then do 永远这种模式 在
  • C++实现String类

    C 实现String类 还没有完成 待继续 有以下注意的点 1 赋值操作符返回的是一个MyString 而重载的 返回的是一个MyString 其中的原因参看 effective c 主要是返回引用的时候 必须返回必须在此函数之前存在的引用
  • Android Studio安装教程+打包APK

    前言 这是一篇给新人的教程 如果你觉得简单啰嗦请保持冷静 同时如果本篇能给予到你帮助 是我的荣幸 Android Studio安装教程 点击链接下载Android Studio Android Studio官网下载 下载完成后双击 exe文
  • [实验三]LZW 编解码算法实现与分析

    目录 一 LZW算法 1 1 编码步骤 1 2 解码步骤 1 3 关于有可能出现当前码字CW不在词典中的情况说明 二 代码实现 2 1 程序说明 2 2 数据结构 2 3 bitio h 2 4 bitio c 2 5 lzw c 三 实验
  • VC++ FTP文件上传(断点续传)

    include