用以删除一个目录下类似“# *****”格式的配置文件注释,只可删除单独的行。
- #include <stdio.h>
- #include <string.h>
- #include <dirent.h>
- #include <time.h>
- int traversal_dir(const char *dir, int dept);
- int del_file_com(const char *file_path);
- int main(int argc, char *argv[])
- {
- if(argc<2) {
- fprintf(stdout, "input dir...\n");
- return -1;
- }
- int dept = 0;
- traversal_dir(argv[1], dept);
- return 0;
- }
- int traversal_dir(const char *dir, int dept)
- {
- DIR *dirptr = NULL;
- if(NULL == (dirptr=opendir(dir))) {
- fprintf(stdout, "no such dirpath:%s\n", dir);
- return -1;
- }
- struct dirent *entry;
- while(NULL != (entry=readdir(dirptr))) {
- //when the entry is sub_dir into it
- if((!strcmp(entry->d_name, ".")) || (!strcmp(entry->d_name, ".."))) {
- continue;
- }
- int i;
- for(i=0; i<dept; ++i) {
- fprintf(stdout, " ");
- }
- char dir_buf[1024];
- snprintf(dir_buf, sizeof(dir_buf), "%s/%s", dir, entry->d_name);
- if(DT_DIR == entry->d_type) { /* 4 */
- fprintf(stdout, "dir:%s/%s\n", dir, entry->d_name);
- traversal_dir(dir_buf, dept+4);
- } else if (DT_REG == entry->d_type) {
- fprintf(stdout, "file:%s\n", entry->d_name);
- del_file_com(dir_buf);
- } else {
- continue;
- }
- }
- return 0;
- }
- int del_file_com(const char *file_path)
- {
- const char *old_file = file_path;
- char new_file[1024];
- snprintf(new_file, sizeof(new_file), "%s.%ld", old_file, time(NULL));
- // fprintf(stdout, "del_file_com...\n");
- // fprintf(stdout, "old_file:%s, new_file:%s\n", old_file, new_file);
- FILE *fp_from = fopen(old_file, "r");
- FILE *fp_to = fopen(new_file, "w");
- if((NULL==fp_from) || (NULL==fp_to)) {
- return -1;
- }
- char line[1024];
- char *cp = line;
- while(NULL != (fgets(cp, sizeof(line), fp_from))) {
- while(((' '==*cp)||('\t'==*cp)||('\n'==*cp)) && ('\0'!=*cp)) {
- ++cp;
- }
- if(('#'!=*cp) && ('\0'!=*cp)) {
- fprintf(fp_to, "%s", line);
- }
- cp = line;
- }
- fclose(fp_from);
- fclose(fp_to);
- rename(new_file, old_file);
- return 0;
- }
备注:
- struct dirent
- {
- #ifndef __USE_FILE_OFFSET64
- __ino_t d_ino;
- __off_t d_off;
- #else
- __ino64_t d_ino;
- __off64_t d_off;
- #endif
- unsigned short int d_reclen;
- unsigned char d_type;
- char d_name[256]; /* We must not include limits.h! */
- };
- #ifdef __USE_LARGEFILE64
- struct dirent64
- {
- __ino64_t d_ino;
- __off64_t d_off;
- unsigned short int d_reclen;
- unsigned char d_type;
- char d_name[256]; /* We must not include limits.h! */
- };
- #endif
- /* File types for `d_type'. */
- enum
- {
- DT_UNKNOWN = 0,
- # define DT_UNKNOWN DT_UNKNOWN
- DT_FIFO = 1,
- # define DT_FIFO DT_FIFO
- DT_CHR = 2,
- # define DT_CHR DT_CHR
- DT_DIR = 4,
- # define DT_DIR DT_DIR
- DT_BLK = 6,
- # define DT_BLK DT_BLK
- DT_REG = 8,
- # define DT_REG DT_REG
- DT_LNK = 10,
- # define DT_LNK DT_LNK
- DT_SOCK = 12,
- # define DT_SOCK DT_SOCK
- DT_WHT = 14
- # define DT_WHT DT_WHT
- };
转载于:https://blog.51cto.com/dazhang/785459