0 1 min 3 semanas

Este programa analiza un directorio (y sus subdirectorios), calcula un hash del contenido de cada archivo y detecta cuáles son duplicados reales, mostrando sus rutas completas.


Requisitos

  • C++17 o superior
  • Compilador moderno (g++ 8+, MSVC, Clang)
  • Soporte para <filesystem>
#include <iostream>
#include <filesystem>
#include <fstream>
#include <unordered_map>
#include <vector>
#include <sstream>

namespace fs = std::filesystem;

// Función para generar un hash simple del archivo
std::string generarHash(const fs::path& rutaArchivo) {
    std::ifstream archivo(rutaArchivo, std::ios::binary);
    if (!archivo) return "";

    std::ostringstream contenido;
    contenido << archivo.rdbuf();
    
    std::string datos = contenido.str();
    std::hash<std::string> hasher;
    return std::to_string(hasher(datos));
}

int main() {
    std::string ruta;
    std::cout << "Ingrese la ruta a analizar: ";
    std::getline(std::cin, ruta);

    fs::path directorio(ruta);

    if (!fs::exists(directorio) || !fs::is_directory(directorio)) {
        std::cerr << "Ruta inválida." << std::endl;
        return 1;
    }

    std::unordered_map<std::string, std::vector<fs::path>> mapaHashes;

    try {
        for (const auto& entrada : fs::recursive_directory_iterator(directorio)) {
            if (entrada.is_regular_file()) {
                std::string hash = generarHash(entrada.path());
                if (!hash.empty()) {
                    mapaHashes[hash].push_back(entrada.path());
                }
            }
        }

        std::cout << "\nArchivos duplicados encontrados:\n";

        for (const auto& [hash, listaArchivos] : mapaHashes) {
            if (listaArchivos.size() > 1) {
                std::cout << "\nDuplicados:\n";
                for (const auto& ruta : listaArchivos) {
                    std::cout << " - " << ruta << std::endl;
                }
            }
        }

    } catch (const fs::filesystem_error& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }

    return 0;
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *