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