<commit_before>/*
 * Description: 展示目录中的子目录和文件列表。
 *     Created: 2016年4月8日
 *      Author: NieYong<<EMAIL>>
 */

#ifndef _GNU_SOURCE
    #define _GNU_SOURCE
#endif
#ifndef __USE_XOPEN
    #define __USE_XOPEN
#endif

#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <time.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>

/**
 * 将秒数转换成"2016-04-08 18:30:20"格式的字符串。
 * @param seconds 某个日期时间的秒数
 * @param datetimestr 存储日期时间长度为20的字符串数组
 */
void sec2datetimestr(const time_t seconds, char *datetimestr) {
    strftime(datetimestr, 20, "%Y-%m-%d %H:%M:%S", localtime(&seconds));
}

void printDir(char *dir_path) {
    struct stat buf;
    char *ftype;
    char ctime[20];
    char mtime[20];

    printf("%-4s %-50s %-22s %-22s\n", "type", "file_name", "ctime", "mtime");
    printf("----------------------------------------------------------------------------------------------------\n");
    chdir(dir_path); // 由于opendir传入的参数是目录名，因此必须切换至该目录
    DIR *ds = opendir(dir_path);
    struct dirent *dp = readdir(ds);
    while (NULL != dp) {
        if (lstat(dp->d_name, &buf) == -1) { // 定义__USE_XOPEN才能使用lstat，否则只能使用stat
            fprintf(stderr, "get [%s] inode information fail\n", dp->d_name);
            strerror(errno);
            dp = readdir(ds);
            continue;
        }
        if (S_ISREG(buf.st_mode)) {
            ftype = "FILE";
        } else if (S_ISDIR(buf.st_mode)) {
            ftype = "DIR";
        } else if (S_ISCHR(buf.st_mode)) {
            ftype = "CHR";
        } else if (S_ISFIFO(buf.st_mode)) {
            ftype = "FIFO";
        } else if (S_ISLNK(buf.st_mode)) {
            ftype = "LINK";
        } else if (S_ISBLK(buf.st_mode)) {
            ftype = "BLK";
        } else if (S_ISSOCK(buf.st_mode)) { // 定义_GNU_SOURCE才能使用S_ISSOCK
            ftype = "SOCK";
        } else {
            ftype = "UNKO";
        }
        sec2datetimestr(buf.st_ctime, ctime);
        sec2datetimestr(buf.st_mtime, mtime);
        printf("%-4s %-50s %-22s %-22s\n", ftype, dp->d_name, ctime, mtime);

        dp = readdir(ds);
    }
    closedir(ds);
}

int main(int argc, char **argv) {
    if (argc != 2) {
        fprintf(stderr, "无效参数。使用说明：file_list <目录路径>\n");
        exit(EXIT_FAILURE);<commit_msg>增加文件访问权限列<commit_after>/*
 * Description: 展示目录中的子目录和文件列表。
 *     Created: 2016年4月8日
 *      Author: NieYong<<EMAIL>>
 */

#ifndef _GNU_SOURCE
    #define _GNU_SOURCE
#endif
#ifndef __USE_XOPEN
    #define __USE_XOPEN
#endif

#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <time.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>

/**
 * 将秒数转换成"2016-04-08 18:30:20"格式的字符串。
 * @param seconds 某个日期时间的秒数
 * @param datetimestr 存储日期时间长度为20的字符串数组
 */
void sec2datetimestr(const time_t seconds, char *datetimestr) {
    strftime(datetimestr, 20, "%Y-%m-%d %H:%M:%S", localtime(&seconds));
}

void computeAccess(char *access_str, mode_t mode) {
    // user access
    if (S_IRUSR & mode) {
        access_str[0] = 'r';
    } else {
        access_str[0] = 'r';
    }
    if (S_IWUSR & mode) {
        access_str[1] = 'w';
    } else {
        access_str[1] = 'r';
    }
    if (S_IXUSR & mode) {
        access_str[2] = 'x';
    } else {
        access_str[2] = 'r';
    }

    // group access
    if (S_IRGRP & mode) {
        access_str[3] = 'r';
    } else {
        access_str[3] = 'r';
    }
    if (S_IWGRP & mode) {
        access_str[4] = 'w';
    } else {
        access_str[4] = '-';
    }
    if (S_IXGRP & mode) {
        access_str[5] = 'x';
    } else {
        access_str[5] = '-';
    }

    // other access
    if (S_IROTH & mode) {
        access_str[6] = 'r';
    } else {
        access_str[6] = '-';
    }
    if (S_IWOTH & mode) {
        access_str[7] = 'w';
    } else {
        access_str[7] = '-';
    }
    if (S_IXOTH & mode) {
        access_str[8] = 'x';
    } else {
        access_str[8] = '-';
    }
    access_str[9] = '\0';
}

void printDir(char *dir_path) {
    struct stat buf;
    char *ftype;
    char faccess[10];
    char ctime[20];
    char mtime[20];

    printf("%-4s %-10s %-50s %-22s %-22s\n", "type", "access", "file_name", "ctime", "mtime");
    printf("----------------------------------------------------------------------------------------------------\n");
    chdir(dir_path); // 由于opendir传入的参数是目录名，因此必须切换至该目录
    DIR *ds = opendir(dir_path);
    struct dirent *dp = readdir(ds);
    while (NULL != dp) {
        if (lstat(dp->d_name, &buf) == -1) { // 定义__USE_XOPEN才能使用lstat，否则只能使用stat
            fprintf(stderr, "get [%s] inode information fail\n", dp->d_name);
            strerror(errno);
            dp = readdir(ds);
            continue;
        }
        if (S_ISREG(buf.st_mode)) {
            ftype = "FILE";
        } else if (S_ISDIR(buf.st_mode)) {
            ftype = "DIR";
        } else if (S_ISCHR(buf.st_mode)) {
            ftype = "CHR";
        } else if (S_ISFIFO(buf.st_mode)) {
            ftype = "FIFO";
        } else if (S_ISLNK(buf.st_mode)) {
            ftype = "LINK";
        } else if (S_ISBLK(buf.st_mode)) {
            ftype = "BLK";
        } else if (S_ISSOCK(buf.st_mode)) { // 定义_GNU_SOURCE才能使用S_ISSOCK
            ftype = "SOCK";
        } else {
            ftype = "UNKO";
        }
        computeAccess(faccess, buf.st_mode);
        sec2datetimestr(buf.st_ctime, ctime);
        sec2datetimestr(buf.st_mtime, mtime);
        printf("%-4s %-10s %-50s %-22s %-22s\n", ftype, faccess, dp->d_name, ctime, mtime);

        dp = readdir(ds);
    }
    closedir(ds);
}

int main(int argc, char **argv) {
    if (argc != 2) {
        fprintf(stderr, "无效参数。使用说明：file_list <目录路径>\n");
        exit(EXIT_FAILURE);
{'fraction_non_alphanumeric': 0.19483690912262341, 'fraction_numerical': 0.020931449502878074, 'mean_word_length': 1.9694458829621957, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 31, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1638825', 'n_tokens_mistral': 2416, 'n_tokens_neox': 2396, 'n_words': 419}