如何使用C循环浏览文件夹中的所有文件?

NSR*_*ver 9 c

我想从目录中的所有文件名中删除特定的子字符串:

- 来自'Futurama s1e20'的'XYZ.com' - [XYZ.com] .avi' -

所以基本上我需要为方法提供一个所需的子字符串,它必须循​​环遍历所有文件名并进行比较.

我无法弄清楚如何使用C循环遍历文件夹中的所有文件.

sud*_*03r 10

#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 ) ;
  }
 }
}

Run Code Online (Sandbox Code Playgroud)

虽然我个人更喜欢脚本来完成这项工作


#!/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

Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用man 3 fts使用C循环遍历文件夹中的所有文件:

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