How do I loop through all files in a folder using C?

前端 未结 6 979
渐次进展
渐次进展 2020-12-06 06:00

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

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

相关标签:
6条回答
  • 2020-12-06 06:27

    I know this answer will get me down-voted, but your problem is perfect for a shell script, (or .cmd script), a PHP script, or PERL script. Doing it in C is more work than the problem is worth.

    0 讨论(0)
  • 2020-12-06 06:36

    The key functions are _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);
    
    0 讨论(0)
  • 2020-12-06 06:37
    #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 would personally prefer a script to do this job like

    
    #!/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 讨论(0)
  • 2020-12-06 06:38

    Take a look at dirent.h.

    0 讨论(0)
  • 2020-12-06 06:40

    You may use FTS(3) to loop through all files in a folder using C:

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

    0 讨论(0)
  • 2020-12-06 06:46

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

    0 讨论(0)
提交回复
热议问题