How to skip all files in a folder using C?

I want to remove a specific substring from all the file names in a directory:

- like "XYZ.com" from "Futurama s1e20 - [XYZ.com] .avi '-

So basically I need to provide the method using the required substring, and it should iterate over all the file names and compare.

I cannot figure out how to iterate over all the files in a folder using C.

+6
c
source share
7 answers

You can use man 3 fts to scroll through all the files in a folder using C:

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

+5
source share
#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 ) ; } } } 

Although I personally would prefer the script to do this work, for example

 #!/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 
+8
source share

I know this answer will make me vote, but your problem is perfect for a shell script, (or .cmd script), PHP script or PERL script. Doing this in C is more work than a problem.

+4
source share

Take a look at dirent.h .

+3
source share

Key Features: _findfirst, _findnext and _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
source share

fts has a nice interface, but it is 4.4BSD and is not portable. (I was recently bitten in the rear by some software with an inherent dependence on fts.) opendir and readdir less interesting, but are POSIX standards and portable.

0
source share

fts (3) - 4.4BSD, Linux, Mac OS X, ... Only FYI!

0
source share

All Articles