c语言写的批量处理文件小demo,修改后使得文件的md5值变动
2016-03-30 10:42
417 查看
这里是源码,自己造轮子,搞了个比较戳的链表,还使用了栈的基本原理。在每个文件增加一段byte,则可使得计算该文件md5值时不同。使用了
opendir和readdir
gcc file.c -o test -lpthread
opendir和readdir
gcc file.c -o test -lpthread
#include <stdio.h> #include <dirent.h> #include <pthread.h> #include <stdlib.h> #include <string.h> #include <unistd.h> typedef struct Node { //char name[255]; char path[2048]; struct Queue *next; }Queue; static pthread_mutex_t pm_t; static pthread_t pt_t; static int queue_count = 0; static Queue *queue_head = NULL; Queue *poll(){ Queue *temp = NULL; Queue *last = NULL; if(queue_head == NULL){ return NULL; } temp = queue_head; //temp = (Queue *)(queue_head->next); for(;;){ if(temp == NULL || queue_count <= 0){ queue_count = 0; printf("a\n"); return NULL; } if(temp->next == NULL){ if(queue_count == 1){ queue_head == NULL; queue_count = 0; printf("b\n"); return temp; } if(last == NULL){ printf("c\n"); return NULL; } last->next = NULL; queue_count --; printf("d\n"); return temp; } last = temp; temp = (Queue *)temp->next; } printf("poll temp = %p\n",temp); } Queue *add_first(Queue *tag){ printf("add_first = %s\n",tag->path); Queue *temp = queue_head; if(queue_head == NULL) { queue_head = tag; queue_head->next = NULL; queue_count ++; return tag; } queue_head = tag; queue_head->next = (struct Queue *)temp; queue_count ++; return tag; } void *dealwith(void *ptr); void find_path(char *path); void operation_file(); int main(int argc,char **argv){ if(argc != 2){ printf("invalid argument !\n"); return 0; } int len = sizeof(Queue); //initialize local path char *path = "/home/hjt/filetest"; path = argv[1]; printf("Start analyse file ...\n"); find_path(path); printf("Start operation file ....\n"); //initialize thread & mutex lock //pthread_mutex_init(&pm_t,NULL); //pthread_create(&pt_t,NULL,dealwith,NULL); //show operation percent int temp = -1; for(;;) { sleep(1); break; } operation_file(queue_head); //pthread_join(pt_t,NULL); printf("succeed! done...\n"); return 0; } void operation_file() { for(;;){ Queue *q = poll(); printf("operation_file q = %p\n",q); if(q != NULL) { FILE *file = fopen(q->path,"a+"); printf("operation_file file = %p,q->path = %s\n",file,q->path); if(file != NULL) { printf("start file ... \n"); fwrite("@hjtthj@",8,1,file); fflush(file); fclose(file); }else{ printf("Be closed! \n"); } free(q); }else{ return ; } } } void *dealwith(void *ptr) { if(ptr == NULL) { return ; } for(;;) { Queue *queue; queue = (Queue *)poll(ptr); if(queue == NULL) { return ; } } } void find_path(char *path) { DIR *dir; dir = opendir(path); struct dirent *dirent_t; //printf("ptr d = %p\n",dir); while(dir != NULL && ((dirent_t = readdir(dir)) != NULL)) { if((strcmp(dirent_t->d_name,".") != 0) 4000 && (strcmp(dirent_t->d_name,"..") != 0)){ //printf("dirent_t d_reclen = %d,d_type = %d,d_name = %s\n",dirent_t->d_reclen,dirent_t->d_type,dirent_t->d_name); if(dirent_t->d_type == DT_REG)//DT_DIR { Queue *inner_queue = (Queue *)malloc(sizeof(Queue)); if(inner_queue == NULL){ break; } strcat((inner_queue)->path,path); strcat((inner_queue)->path,"/"); strcat((inner_queue)->path,dirent_t->d_name); queue_head = add_first(inner_queue); //printf("dirent_t->d_name = %s\n",dirent_t->d_name); //printf("queue_path = %s\n",inner_queue->path); } else if(dirent_t->d_type == DT_DIR) { char path_inner[4096]; memset(path_inner,0,sizeof(path_inner)); strcat(path_inner,path); strcat(path_inner,"/"); strcat(path_inner,dirent_t->d_name); //printf("folder path_inner = %s\n",path_inner); //printf("folder d_name = %s\n",dirent_t->d_name); find_path(path_inner); } } } closedir(dir); free(dirent_t); }
相关文章推荐