用以删除一个目录下类似“# *****”格式的配置文件注释,只可删除单独的行。
#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
};