2009-08-13 17 views
6

मैं एक निर्देशिका में सभी फ़ाइल नाम में से एक विशेष सबस्ट्रिंग निकालना चाहते हैं:सी का उपयोग कर फ़ोल्डर में सभी फ़ाइलों के माध्यम से मैं कैसे लूप करूं?

- जैसे 'XYZ.com' 'फ़्यूचरामा s1e20 - [XYZ.com] .avi' - से

तो मूल रूप से मुझे वांछित सबस्ट्रिंग के साथ विधि प्रदान करने की आवश्यकता है, और इसे सभी फ़ाइल नामों के माध्यम से लूप करना होगा और इसकी तुलना करना होगा।

मैं सी

+2

+1 आपको टीवी शो एक्सडी की क्या और अच्छी पसंद है। – zeboidlund

उत्तर

3

का उपयोग कर dirent.h पर एक नजर डालें किसी फ़ोल्डर में सभी फ़ाइलों के माध्यम से कैसे पाश यह पता लगाने नहीं कर सकते।

1

प्रमुख कार्य _findfirst हैं, _findnext और

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

एपीआई लिंक्सु/यूनिक्स के तहत अलग है। –

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

हालांकि _findclose मैं व्यक्तिगत रूप से

जैसे इस काम को करने के लिए एक स्क्रिप्ट पसंद करूंगा
0

fts का एक अच्छा इंटरफ़ेस है, लेकिन यह 4.4BSD है और पोर्टेबल नहीं है। (मुझे हाल ही में कुछ सॉफ्टवेयर द्वारा पीछे की ओर काट दिया गया है जिसमें एफटीएस पर अंतर्निहित निर्भरता है।) opendir और readdir कम मजेदार हैं लेकिन पॉज़िक्स मानक हैं और पोर्टेबल हैं।

4

मुझे पता है कि यह जवाब मुझे नीचे वोट देगा, लेकिन आपकी समस्या एक शेल स्क्रिप्ट, (या .cmd स्क्रिप्ट), एक PHP स्क्रिप्ट, या PERL स्क्रिप्ट के लिए बिल्कुल सही है। सी में ऐसा करना समस्या से अधिक काम है।

0

fts (3) 4.4BSD, लिनक्स, मैक ओएस एक्स, ... बस FYI है!

संबंधित मुद्दे

 संबंधित मुद्दे