|
VC++ 中实现大文件下载
在 VC++ 中实现大文件下载的基本步骤可以使用 WinHTTP 或 WinINet 库。下面是一个使用 WinHTTP 库的示例,展示如何下载大文件并保存到本地磁盘。
### 示例代码
以下是一个简单的示例,展示如何使用 WinHTTP 下载大文件:
- ```cpp
- #include <windows.h>
- #include <winhttp.h>
- #include <iostream>
- #include <fstream>
- #pragma comment(lib, "winhttp.lib")
- void DownloadFile(const std::wstring& server, const std::wstring& filePath, const std::wstring& savePath) {
- HINTERNET hSession = WinHttpOpen(L"A WinHTTP Example Program/1.0",
- WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
- WINHTTP_NO_PROXY_NAME,
- WINHTTP_NO_PROXY_BYPASS, 0);
- if (!hSession) {
- std::cerr << "WinHttpOpen failed." << std::endl;
- return;
- }
- HINTERNET hConnect = WinHttpConnect(hSession, server.c_str(), INTERNET_DEFAULT_HTTP_PORT, 0);
- if (!hConnect) {
- std::cerr << "WinHttpConnect failed." << std::endl;
- WinHttpCloseHandle(hSession);
- return;
- }
- HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", filePath.c_str(),
- NULL, WINHTTP_NO_REFERER,
- WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
-
- if (!hRequest) {
- std::cerr << "WinHttpOpenRequest failed." << std::endl;
- WinHttpCloseHandle(hConnect);
- WinHttpCloseHandle(hSession);
- return;
- }
- // 发送请求
- if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0,
- WINHTTP_NO_REQUEST_DATA, 0, 0, 0)) {
- std::cerr << "WinHttpSendRequest failed." << std::endl;
- WinHttpCloseHandle(hRequest);
- WinHttpCloseHandle(hConnect);
- WinHttpCloseHandle(hSession);
- return;
- }
- // 等待响应
- if (!WinHttpReceiveResponse(hRequest, NULL)) {
- std::cerr << "WinHttpReceiveResponse failed." << std::endl;
- WinHttpCloseHandle(hRequest);
- WinHttpCloseHandle(hConnect);
- WinHttpCloseHandle(hSession);
- return;
- }
- // 打开文件以写入
- std::ofstream outFile(savePath, std::ios::binary);
- if (!outFile.is_open()) {
- std::cerr << "Failed to open file for writing." << std::endl;
- WinHttpCloseHandle(hRequest);
- WinHttpCloseHandle(hConnect);
- WinHttpCloseHandle(hSession);
- return;
- }
- // 读取数据并写入文件
- DWORD bytesRead;
- char buffer[4096]; // 4KB 缓冲区
- while (true) {
- if (!WinHttpReadData(hRequest, buffer, sizeof(buffer), &bytesRead) || bytesRead == 0) {
- break; // 读取完成或出错
- }
- outFile.write(buffer, bytesRead);
- }
- // 关闭文件
- outFile.close();
- // 清理
- WinHttpCloseHandle(hRequest);
- WinHttpCloseHandle(hConnect);
- WinHttpCloseHandle(hSession);
- std::cout << "File downloaded successfully to: " << savePath << std::endl;
- }
- int main() {
- std::wstring server = L"example.com"; // 替换为你的服务器地址
- std::wstring filePath = L"/path/to/your/file.zip"; // 替换为文件的路径
- std::wstring savePath = L"C:\\path\\to\\save\\file.zip"; // 替换为保存的路径
- DownloadFile(server, filePath, savePath);
- return 0;
- }
- ```
复制代码
### 说明
1. **打开 WinHTTP 会话**:使用 `WinHttpOpen` 创建一个 WinHTTP 会话。
2. **连接到服务器**:使用 `WinHttpConnect` 连接到指定的服务器。
3. **打开请求**:使用 `WinHttpOpenRequest` 创建一个 GET 请求。
4. **发送请求**:使用 `WinHttpSendRequest` 发送请求并等待响应。
5. **读取数据**:使用 `WinHttpReadData` 读取响应数据并将其写入文件。
6. **清理资源**:关闭文件和 WinHTTP 句柄。
### 注意事项
- 确保替换 `example.com` 和文件路径为实际的服务器地址和文件路径。
- 你可能需要根据服务器的要求设置适当的请求头。
- 该示例代码没有处理错误和异常,建议在实际应用中添加相应的错误处理逻辑。
通过以上步骤,你可以在 VC++ 中实现大文件的下载。
|
|