La cuestion es que he escrito un codigo en C para poder eliminar los x primeros caracteres de todos los archivos encontrados en una ruta especifica.
El programa funciona con direcciones simples aunque no llega a ser muy robusto porque es para uso propio y me da bastante igual.
El problema ocurre cuando trato de poner (o arrastrar) una dirección que contiene espacios. No me reconoce la ruta y por lo tanto el programa es incapaz de listarme los archivos.
He probado insertando la ruta con comillas o sin, pero sin exito.
Si alguien encuentra el problema le estaré muy agradecido. No encuentro soluciones por la web.
(Apenas llevo meses programando. Solo se C y el tema de directorios y dirent.h no lo conocia)
Estoy en Windows con Dev-c++
Código:
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXLONG 300
DIR *carpeta;
struct dirent *archivo; //struct propio de la libreria dirent.h. En archivo.d_name almacenará el nombre de archivo.
struct copia{
char nombre[MAXLONG];
};
int validar_ruta(char ruta[]);
void listar_dir(char ruta[], struct copia aux[], struct copia viejo[], int *cantidad);
void renombrar(char ruta[], struct copia aux[], struct copia viejo[],int *cantidad);
void guardar (char ruta[], struct copia aux[], struct copia viejo[], int *cantidad);
void mostrar(char ruta[]);
int main (int argc, char *argv[]){
struct copia aux[MAXLONG], viejo[MAXLONG];
char ruta[MAXLONG];
int cantidad=0, repetir;
do{
repetir=0;
system ("cls");
printf("\n\n\t\t\t***** RENAMEADOR *****\n\n\n");
printf("Arrastra la carpeta contenedora o escribe/pega la ruta\n\n");
printf("DISCLAIMER: En caso de que los archivos no se hayan renombrado y el programa no muestre error\n\t revisa las contrabarras '\\' en la direccion proporcionada...\n\n");
printf("\n\nRuta de los archivos: "); gets(ruta);
if (validar_ruta(ruta)){
listar_dir(ruta,aux,viejo,&cantidad);
renombrar(ruta,aux,viejo,&cantidad);
guardar(ruta,aux,viejo,&cantidad);
mostrar(ruta);
}
else repetir=1;
}while (repetir);
return 0;
};
int validar_ruta(char ruta[]){
int i;
char enter, aux;
carpeta = opendir(ruta);
if (carpeta == NULL){
printf("\nRuta a buscar: %s\n",ruta);
printf("\nEsta ruta no es valida !!\n");
printf("\n\n\nPress ENTER to retry..."); scanf("%c",&enter);
closedir(carpeta);
return 0;
}
else{
closedir(carpeta);
/*comprueba la ruta y añade un \ final si es necesario*/
while (ruta[i]!='\0'){
i++;
}
// printf("\n%c\n",ruta[i-1]); // ¿cual es el ultimo caracter?
if (ruta[i-1]!='\\'){ // si el ultimo caracter NO ES \, se lo añades.
strcat(ruta,"\\");
}
else return 1;
}
}
void listar_dir(char ruta[], struct copia aux[], struct copia viejo[], int *cantidad){
int i;
*cantidad=0;
carpeta = opendir(ruta);
printf("\nRuta a buscar: %s\n",ruta);
if (carpeta != NULL){ // verifica que la ruta sea valida
printf("Archivos actuales:\n\n");
while ((archivo = readdir(carpeta))){ // lee el directorio
// puts (archivo->d_name);
if (strcmp(archivo->d_name,".")){
if (strcmp(archivo->d_name,"..")){
strcpy(aux[*cantidad].nombre,archivo->d_name); //copia al struct auxiliar la info que va recopilando el struct de dirent.h
puts (aux[*cantidad].nombre);
strcpy(viejo[*cantidad].nombre,aux[*cantidad].nombre); // copia el aux a uno viejo que en guardar sirve para el rename
*cantidad+=1; // auxiliar para saber cuántos archivos ha leido
}
}
}
}
else
perror ("\nError al abrir el directorio... Existe?\n\n");
closedir(carpeta);
}
void renombrar(char ruta[], struct copia aux[], struct copia viejo[], int *cantidad){
int i, j, l, ints;
printf("\n\nNumero de primeros caracteres a eliminar: "); scanf("%d",&ints);
system("cls");
for (i=0; i<*cantidad; i++){
l=strlen(aux[i].nombre); // utilizar el tamaño del nombre para cortar el siguiente for a la hora de renombrarlo.
for (j=0; aux[i].nombre[j]!='\0'; j++){
aux[i].nombre[j]=aux[i].nombre[j+ints]; // empieza substituyendo la posicion [0] de aux.nombre por lo que hay en la posición que ha marcado el user.
}
// puts (aux[i].nombre); // struct aux con todos los nombres ya modificados
}
}
void guardar (char ruta[], struct copia aux[], struct copia viejo[], int *cantidad){
char ruta_nuevo[MAXLONG], ruta_viejo[MAXLONG];
int i, opcion=0;
printf("\n\n");
printf("Los archivos se renombraran de la siguiente manera:\n\n");
for (i=0; i<*cantidad; i++){
printf ("%s\n",aux[i].nombre);
}
printf("\n\nEstas segur@ de sobreescribir?\n");
printf("1) Yes\n");
printf("2) No\n");
printf("Opcion: "); scanf("%d",&opcion);
if (opcion==1){
for (i=0; i<*cantidad; i++){
strcpy (ruta_viejo,ruta);
strcat(ruta_viejo,viejo[i].nombre);
// printf("Archivo Viejo: %s\n",ruta_viejo);
strcpy (ruta_nuevo,ruta);
strcat (ruta_nuevo,aux[i].nombre);
// printf("Archivo Nuevo: %s\n\n",ruta_nuevo);
rename(ruta_viejo,ruta_nuevo);
}
}
}
void mostrar(char ruta[]){
system ("cls");
carpeta = opendir(ruta);
printf("\nArchivos almacenados en: %s\n\n",ruta);
while ((archivo = readdir(carpeta))){
if (strcmp(archivo->d_name,".")){
if (strcmp(archivo->d_name,"..")){
puts (archivo->d_name);
}
}
}
closedir(carpeta);
}