2009-08-13 25 views
6

Quiero eliminar una subcadena en particular de todos los nombres de archivo en un directorio:¿Cómo recorro todos los archivos en una carpeta usando C?

- como 'XYZ.com' de 'Futurama s1e20 - [XYZ.com] .avi' -

Así que, básicamente, tengo que proporcionar el método con una subcadena deseada, y tiene que recorrer todos los nombres de archivo y comparar.

me puedo imaginar cómo recorrer todos los archivos en una carpeta usando C.

+2

+1 por evidente, sabes qué y buena elección de programa de televisión xD. – zeboidlund

Respuesta

1

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); 
+1

La API es diferente en Linxu/Unix. –

8
#include <stdio.h> 
#include <dirent.h> 
#include <sys/stat.h> 
#include <sys/types.h> 

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 Yo personalmente preferiría un script 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 

0

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

4

Sé que esta respuesta me va a bajar la votación, pero su problema es perfecto para un script de shell, (o script .cmd), un script PHP o script PERL. Hacerlo en C es más trabajo de lo que vale el problema.

0

fts (3) es 4.4BSD, Linux, Mac OS X, ... ¡Solo para FYI!

Cuestiones relacionadas