您的位置:首页 > 编程语言 > C语言/C++

c语言写的批量处理文件小demo,修改后使得文件的md5值变动

2016-03-30 10:42 417 查看
这里是源码,自己造轮子,搞了个比较戳的链表,还使用了栈的基本原理。在每个文件增加一段byte,则可使得计算该文件md5值时不同。使用了

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: