Welcome, guest | Sign In | My Account | Store | Cart

make subdirs recursively

C, 89 lines
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/**
 *@brief 递归的创建一个路径下的所有子目录. 内存考虑, fullpath长度为 MAX_PATH_LEN,  对于n级目录, 需要的调用栈就
?,
 *       并不会等比级数的扩张
 *
 *@param[in] root 根目录,必须是文件件路径
 */
static int create_subdir(char *root,  mode_t mode, int depth){
    if(0 == depth){
        return EYOU_FILE_TRUE;
    }

    int i=0;
    char fname[2] = {0};
    char fullpath[MAX_PATH_LEN];

    while(i < 16){
        snprintf(fname, 2, "%x", i);
        if('/' == root[strlen(root)-1] ){
            snprintf(fullpath, MAX_PATH_LEN, "%s%s",root,fname);
        }
        else{
            snprintf(fullpath, MAX_PATH_LEN, "%s/%s", root, fname);
        }

        eyou_syslog("simple filed :%s\n", fullpath);
        if( -1 == mkdir(fullpath, mode)){
            eyou_syslog("simple filed :create dir %s : %s", fullpath, strerror(errno));
            return EYOU_FILE_FALSE;
        }

        /* 一旦出错就返回, 以避免重复创建。 其他错误需要人工处理 */
        if ( EYOU_FILE_FALSE == create_subdir(fullpath,mode,depth-1)){
            return EYOU_FILE_FALSE;
        }
        i++;
    }
                     return EYOU_FILE_TRUE;
}

/**
 *@brief 在配置文件指定的路径下,当这个路径被第一次分配时,  创建可能分配到的所有的子文件夹, 即文件夹0-9a-z. 
 *        这个功能由一个daemon负责, 不需要在程序中做, 以减少i/0操作.  
 *
 *       这个程序任然可以用做创建目录
 *
 *
 *@param[in] year_mon某年某月的目录, 比如200904. 当为空是, 设定为当前年月
 */
int eyou_create_dir(char *year_mon)
{

    SIMPLE_FILED_PATH_CONFIG *configs = NULL;
    char path[MAX_PATH_LEN];
    char date[7] = {0};

    mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO ;

    if ( NULL == glb_flink_cfg){
        glb_flink_cfg = get_path_config();;
    }

    configs = get_path_config();
    if(NULL == configs){
        return EYOU_FILE_FALSE;
    }

    if(NULL == year_mon){
        /* 先创建文件夹  */
        time_t epoch_time = time(NULL);
        struct tm *cur_time = localtime(&epoch_time);
        cur_time->tm_year += 1900;
snprintf(date, 7, "%04d%02d", cur_time->tm_year, cur_time->tm_mon);

        year_mon = date;
    }
    
    while(configs){
        snprintf(path, MAX_PATH_LEN, "%s/%s", configs->str_path, year_mon);

        /* 创建以日期分类的目录 */
        if( -1 != mkdir(path, mode) ){
            create_subdir(path, mode, configs->hash_level);
        }
        configs = configs->next;
    }

    return EYOU_FILE_TRUE;
}   
    
Created by J Y on Tue, 16 Jun 2009 (MIT)
C recipes (32)
J Y's recipes (21)

Required Modules

  • (none specified)

Other Information and Tasks