Python 代码实现保存各种文件到本地

下面给出一个简单的下载器的模块化实现。我们将下载器分为以下几个模块:

  1. 用户界面模块:处理用户输入和输出。
  2. 下载模块:负责下载文件。
  3. 文件保存模块:负责将下载的文件保存到本地。

我们将分别给出这些模块的实现。请注意,以下代码仅作为示例,实际生产环境中可能需要更多的错误处理和异常情况处理。

用户界面模块

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;
}

整体设计思想是将不同的功能模块化,使得每个模块都专注于完成自己的任务,提高了代码的可维护性和复用性。同时,在主程序中进行了异常处理,保证了程序的健壮性和稳定性。