¿Cómo hago un bucle a través de todos los archivos en una carpeta usando C?

Quiero eliminar una subcadena particular de todos los nombres de archivos en un directorio:

– como ‘XYZ.com’ de ‘Fututwig s1e20 – [XYZ.com] .avi’ –

Básicamente, necesito proporcionar el método con una subcadena deseada, y tiene que recorrer todos los nombres de archivo y comparar.

No puedo averiguar cómo recorrer todos los archivos en una carpeta usando C.

Puede usar man 3 fts para recorrer todos los archivos en una carpeta usando C:

http://keramida.wordpress.com/2009/07/05/fts3-or-avoiding-to-reinvent-the-wheel/

#include  #include  #include  #include  int main(int argc, char** argv) { struct dirent *dp; DIR *dfd; char *dir ; dir = argv[1] ; if ( argc == 1 ) { printf("Usage: %s dirname\n",argv[0]); return 0; } if ((dfd = opendir(dir)) == NULL) { fprintf(stderr, "Can't open %s\n", dir); return 0; } char filename_qfd[100] ; char new_name_qfd[100] ; while ((dp = readdir(dfd)) != NULL) { struct stat stbuf ; sprintf( filename_qfd , "%s/%s",dir,dp->d_name) ; if( stat(filename_qfd,&stbuf ) == -1 ) { printf("Unable to stat file: %s\n",filename_qfd) ; continue ; } if ( ( stbuf.st_mode & S_IFMT ) == S_IFDIR ) { continue; // Skip directories } else { char* new_name = get_new_name( dp->d_name ) ;// returns the new string // after removing reqd part sprintf(new_name_qfd,"%s/%s",dir,new_name) ; rename( filename_qfd , new_name_qfd ) ; } } } 

Aunque personalmente preferiría un guión para hacer este trabajo como

 #!/bin/bash -f dir=$1 for file in `ls $dir` do if [ -f $dir/$file ];then new_name=`echo "$file" | sed s:to_change::g` mv $dir/$file $dir/$new_name fi done 

Sé que esta respuesta me hará desaprobar, pero su problema es perfecto para un script de shell (o script .cmd), un script PHP o un script PERL. Hacerlo en C es más trabajo de lo que vale el problema.

Echa un vistazo a dirent.h .

Las funciones clave son _findfirst, _findnext y _findclose

 struct _finddata_t file_info; char discard[] = "XYZ.com"; char dir[256] = "c:\\folder\\"; char old_path[256]; char new_path[256]; intptr_t handle = 0; memset(&file_info,0,sizeof(file_info)); strcpy(old_path,dir); strcat(old_path,"*.avi"); handle = _findfirst(old_path,&file_info); if (handle != -1) { do { char *new_name = NULL; char *found = NULL; new_name = strdup(file_info.name); while ((found = strstr(new_name,discard)) != 0) { int pos = found - new_name; char* temp = (char*)malloc(strlen(new_name)); char* remain = found+strlen(discard); temp[pos] = '\0'; memcpy(temp,new_name,pos); strcat(temp+pos,remain); memcpy(new_name,temp,strlen(new_name)); free(temp); } strcpy(old_path,dir); strcat(old_path,file_info.name); strcpy(new_path,dir); strcat(new_path,new_name); rename(old_path,new_path); free(new_name); }while(_findnext(handle,&file_info) != -1); } _findclose(handle); 

fts tiene una interfaz agradable, pero es 4.4BSD y no es portátil. (Recientemente recibí una mordida en la parte trasera por parte de un software con una dependencia inherente de fts). opendir y readdir son menos divertidos pero son estándares POSIX y son portátiles.

fts (3) es 4.4BSD, Linux, Mac OS X, … ¡Solo para tu información!