Renombrar archivos usando C++ en GNU/Linux

En GNU/Linux (en los sistemas operativos tipo Unix en general, incluidos FreeBSD, etc.) no es recomendable manejar nombres de archivo que contengan espacios.

Puede darse el caso de que copiemos desde otro sistema operativo archivos que contienen espacios en su nombre, a nuestra máquina con GNU/Linux. Entónces, ¿qué hacer en esos casos?

Efectivamente… “lo recomendable” es renombrarlos para eliminar los espacios que contiene el nombre de archivo. Como puede ser una cantidad considerable de archivos, nos tomaría mucho tiempo ir renombrando archivo por archivo.

Exísten diferentes opciones para automatizar esa tarea, haciendo un script para bash, utilizando AWK y muchas otras soluciones.

A continuación un programa en C++ al que le podemos enviar una lista de directorios para que renombre todos los archivos que se encuentran en ellos eliminando los espacios del nombre de archivo.

/****************************************
* Archivo: renombrar_archivos.cpp               
* Autor  : SALOMON RINCON TORRES       
* Fecha  : 08/05/2009 (dd/mm/yyyy)
*/

#include
#include
#include
#include

using namespace std;

string QuitaEspacios(string s_cadena)
{
 string s_aux;

 for (int i_pos = 0; i_pos < s_cadena.length(); i_pos++)      {        if (s_cadena[i_pos] != ' ')            s_aux += s_cadena[i_pos];      }  return s_aux; } int main (int argc, char *argv[]) {  DIR *dirh;  struct dirent *dirp;  string s_dir, s_nombre, s_nuevonombre;  int i_renombrados = 0, i_ok = 0, i_fallos = 0; for(int i = 1; i < argc; i++) { s_dir = argv[i]; i_renombrados = 0; i_ok = 0; i_fallos = 0; cout << "******************** Directorio \"" << s_dir << "\" ********************\n" << endl; if ((dirh = opendir(s_dir.c_str())) == NULL) perror("No se pudo accesar al directorio "); else { for (dirp = readdir(dirh); dirp != NULL; dirp = readdir(dirh)) { s_nombre = dirp->d_name;

// Checamo que no sea el directorio . o ..
if (s_nombre != “.” && s_nombre != “..”)
{
cout << "Archivo: " << s_nombre << endl; // Si el nombre del archivo tiene un espacio, lo renombramos if (s_nombre.find(" ") != string::npos) {            s_nuevonombre = QuitaEspacios(s_nombre); if (rename((s_dir+"/"+dirp->d_name).c_str(), (s_dir+”/”+s_nuevonombre).c_str()) == 0)
{
i_renombrados++;
cout << "   === Renombrado como: " << s_nuevonombre.c_str() << endl; } else { i_fallos++; perror("No se pudo renombrar"); } } /* if */ else { i_ok++; cout << "OK\n"; } } /* if */ } /* for */ closedir(dirh); cout << endl; cout << "--- Archivos renombrados: " << i_renombrados << endl; cout << "--- Archivos OK: " << i_ok << endl; cout << "--- Archivos que no se pudieron renombrar: " << i_fallos << endl << endl; } /* else */ } /* for */ return 0; } [/sourcecode]

Etiquetas: , , ,

Una respuesta to “Renombrar archivos usando C++ en GNU/Linux”

  1. Nicolas Says:

    Recomiendo usar boost::filesystem para manejo del sistema de archivos en C++. Hace las cosas mucho mas faciles comparado con las APIs de POSIX

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: