Python 代码实现保存各种文件到本地
下面给出一个简单的下载器的模块化实现。我们将下载器分为以下几个模块:
- 用户界面模块:处理用户输入和输出。
- 下载模块:负责下载文件。
- 文件保存模块:负责将下载的文件保存到本地。
我们将分别给出这些模块的实现。请注意,以下代码仅作为示例,实际生产环境中可能需要更多的错误处理和异常情况处理。
用户界面模块
def get_user_input():
"""获取用户输入的下载链接和保存路径"""
url = input("请输入要下载的链接:")
save_path = input("请输入文件保存路径:")
return url, save_path
def show_message(message):
"""显示消息给用户"""
print(message)
def show_error(error):
"""显示错误给用户"""
print("出错了:", error)
下载模块
import requests
def download_file(url):
"""下载文件"""
try:
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
return response.content
except requests.RequestException as e:
raise RuntimeError(f"下载失败:{e}")
文件保存模块
def save_file(content, save_path):
"""保存文件到本地"""
try:
with open(save_path, 'wb') as f:
f.write(content)
return True
except IOError as e:
raise RuntimeError(f"文件保存失败:{e}")
主程序
def main():
try:
# 获取用户输入
url, save_path = get_user_input()
# 下载文件
content = download_file(url)
# 保存文件
if save_file(content, save_path):
show_message("文件下载成功!")
else:
show_error("文件保存失败")
except Exception as e:
show_error(e)
if __name__ == "__main__":
main()
这个简单的下载器模块化了用户界面、下载和文件保存功能,并对各种异常情况进行了处理。在实际的生产环境中,你可能需要更多的错误处理和安全性措施。
C++代码实现保存各种文件到本地
头文件引入
#include <iostream>
#include <fstream>
#include <string>
#include <curl/curl.h>
用户界面模块
- 用户界面模块负责与用户进行交互,获取用户输入的下载链接和文件保存路径。
- 使用 std::getline 函数获取包含空格的输入,确保能够正确处理带有空格的文件路径。
- 提供了显示普通消息和错误消息的功能。
namespace UI {
std::pair<std::string, std::string> getUserInput() {
std::string url, savePath;
std::cout << "请输入要下载的链接:";
std::getline(std::cin >> std::ws, url); // 获取包含空格的输入
std::cout << "请输入文件保存路径:";
std::getline(std::cin >> std::ws, savePath); // 获取包含空格的输入
return {url, savePath};
}
void showMessage(const std::string& message) {
std::cout << message << std::endl;
}
void showError(const std::string& error) {
std::cerr << "出错了:" << error << std::endl;
}
}
下载模块
- 下载模块负责从指定的 URL 地址下载文件内容,并将内容存储在内存中。
- 使用 libcurl 库进行 HTTP 请求,并通过回调函数将下载的数据写入内存中。
- 提供了处理下载失败情况的功能,并抛出异常以便主程序处理。
namespace Downloader {
size_t writeCallback(void *ptr, size_t size, size_t nmemb, std::string *data) {
data->append((char *)ptr, size * nmemb);
return size * nmemb;
}
std::string downloadFile(const std::string& url) {
CURL *curl = curl_easy_init();
if (!curl) {
throw std::runtime_error("无法初始化 CURL");
}
std::string content;
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK) {
throw std::runtime_error("下载失败:" + std::string(curl_easy_strerror(res)));
}
curl_easy_cleanup(curl);
return content;
}
}
文件保存模块
- 文件保存模块负责将下载的文件内容保存到指定的文件路径中。
- 使用 std::ofstream 类将文件内容写入到指定文件中。
- 提供了处理文件保存失败情况的功能,并抛出异常以便主程序处理。
namespace FileManager {
bool saveFile(const std::string& content, const std::string& savePath) {
std::ofstream file(savePath, std::ios::binary);
if (!file.is_open()) {
throw std::runtime_error("无法打开文件:" + savePath);
}
file.write(content.data(), content.size());
return true;
}
}
主程序
- 主程序负责协调各个模块的工作流程,处理异常情况,并向用户显示相应的消息。
- 使用 try-catch 块来捕获各个模块可能抛出的异常,并通过用户界面模块显示错误消息。
- 负责将用户输入、下载和文件保存等功能串联起来,实现完整的下载流程。
int main() {
try {
// 获取用户输入
auto [url, savePath] = UI::getUserInput();
// 下载文件
std::string content = Downloader::downloadFile(url);
// 保存文件
if (FileManager::saveFile(content, savePath)) {
UI::showMessage("文件下载成功!");
} else {
UI::showError("文件保存失败");
}
} catch (const std::exception& e) {
UI::showError(e.what());
}
return 0;
}
整体设计思想是将不同的功能模块化,使得每个模块都专注于完成自己的任务,提高了代码的可维护性和复用性。同时,在主程序中进行了异常处理,保证了程序的健壮性和稳定性。