程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> how to read directory name using std c in the linux

how to read directory name using std c in the linux

編輯:C++入門知識

[cpp] #include <sys/types.h>  
#include <dirent.h>  
#include <stdio.h>  
#include <unistd.h>  
#include <getopt.h>  
 
#define err_quit printf  
#define err_sys  printf  
 
#define TRUE         1  
#define FALSE        0  
#define EXIT_FAILE   0  
#define EXIT_SUCESS  1  
#define bool         char  
 
static char g_cur_dir[256] = ""; 
int read_directory(char *dir_name, bool brecurse); 
void usage(char state, char *str); 
 
int main(int argc, char **argv) 

    int       c; 
    char      recurse = 0; 
    struct option long_option[]= { 
        {"dirname", no_argument,       NULL,  0 },  
        {"recurse", optional_argument, NULL, 'r'}, 
        {"help",    no_argument,       NULL, 'h'}, 
        {0,         0,                 0,     0 }, 
    }; 
    //read current directory.  
    //if no any params, read current dir files.  
    if(argc < 2) 
    { 
        read_directory("./", TRUE); 
        return ; 
    } 
    //read command line params.  
    while((c = getopt_long(argc, argv, "hr::", long_option, NULL)) != EOF) 
    //while((c = getopt(argc, argv, ":hr::")) != EOF)  
    { 
        switch(c) 
        { 
            case 'r': 
                recurse = 1; 
                break; 
            case 'h': 
                usage(EXIT_SUCESS, argv[0]); 
                break; 
            default: 
                usage(EXIT_FAILE, argv[0]); 
                break; 
        } 
    } 
    if (recurse && (optind == argc)) 
    { 
        read_directory("./", TRUE); 
        exit(0); 
    } 
    //read all files from argv[optind].  
    for(; optind < argc; ++optind) 
    { 
        read_directory(argv[optind], recurse); 
    } 
    exit(0); 

int read_directory(char *dir_name, bool brecurse) 
{    
    DIR            *dp; 
    struct dirent  *dir; 
    strcpy(g_cur_dir, dir_name); 
    if (g_cur_dir[strlen(g_cur_dir) -1] == '/') 
        g_cur_dir[strlen(g_cur_dir) -1] = 0; 
    if ((dp = opendir(dir_name)) == NULL)  
    { 
        err_sys("can't open %s. \n", dir_name); 
        return ; 
    } 
    while( (dir = readdir(dp)) != NULL) 
    { 
        if ( brecurse && (DT_DIR == dir->d_type)  
                && (strcmp(dir->d_name, ".") != 0)  
                && (strcmp(dir->d_name, "..") != 0) ) 
        { 
            printf("%s/", g_cur_dir); 
            printf("%s\n", dir->d_name); 
            strcat(g_cur_dir, "/"); 
            strcat(g_cur_dir, dir->d_name); 
            read_directory(g_cur_dir, brecurse); 
            g_cur_dir[strlen(g_cur_dir) - strlen(dir->d_name) - 1] = 0;  
        } 
        else 
        { 
            printf("%s/", g_cur_dir); 
            printf("%s\n", dir->d_name); 
        } 
    } 
    closedir(dp); 

void usage(char state, char *str) 

    if (state == EXIT_FAILE) 
    { 
        printf("\n"); 
    } 
    else 
    { 
        printf("\n"); 
        printf("========================================\n"); 
        printf("read directory:\n"); 
        printf("\n"); 
        printf("Usage: %s [-r] [directory]\n\n", str); 
        printf("       -r: read all files under each directory, recursively. \n"); 
        printf("========================================\n"); 
        printf("/n"); 
        exit(0); 
    } 

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <unistd.h>
#include <getopt.h>

#define err_quit printf
#define err_sys  printf

#define TRUE         1
#define FALSE        0
#define EXIT_FAILE   0
#define EXIT_SUCESS  1
#define bool         char

static char g_cur_dir[256] = "";
int read_directory(char *dir_name, bool brecurse);
void usage(char state, char *str);

int main(int argc, char **argv)
{
    int       c;
    char      recurse = 0;
    struct option long_option[]= {
        {"dirname", no_argument,       NULL,  0 },
        {"recurse", optional_argument, NULL, 'r'},
        {"help",    no_argument,       NULL, 'h'},
        {0,         0,                 0,     0 },
    };
    //read current directory.
    //if no any params, read current dir files.
    if(argc < 2)
    {
        read_directory("./", TRUE);
        return ;
    }
    //read command line params.
    while((c = getopt_long(argc, argv, "hr::", long_option, NULL)) != EOF)
    //while((c = getopt(argc, argv, ":hr::")) != EOF)
    {
        switch(c)
        {
            case 'r':
                recurse = 1;
                break;
            case 'h':
                usage(EXIT_SUCESS, argv[0]);
                break;
            default:
                usage(EXIT_FAILE, argv[0]);
                break;
        }
    }
    if (recurse && (optind == argc))
    {
        read_directory("./", TRUE);
        exit(0);
    }
    //read all files from argv[optind].
    for(; optind < argc; ++optind)
    {
        read_directory(argv[optind], recurse);
    }
    exit(0);
}
int read_directory(char *dir_name, bool brecurse)
{  
    DIR            *dp;
    struct dirent  *dir;
    strcpy(g_cur_dir, dir_name);
    if (g_cur_dir[strlen(g_cur_dir) -1] == '/')
        g_cur_dir[strlen(g_cur_dir) -1] = 0;
    if ((dp = opendir(dir_name)) == NULL)
    {
        err_sys("can't open %s. \n", dir_name);
        return ;
    }
    while( (dir = readdir(dp)) != NULL)
    {
        if ( brecurse && (DT_DIR == dir->d_type)
                && (strcmp(dir->d_name, ".") != 0)
                && (strcmp(dir->d_name, "..") != 0) )
        {
            printf("%s/", g_cur_dir);
            printf("%s\n", dir->d_name);
            strcat(g_cur_dir, "/");
            strcat(g_cur_dir, dir->d_name);
            read_directory(g_cur_dir, brecurse);
            g_cur_dir[strlen(g_cur_dir) - strlen(dir->d_name) - 1] = 0;
        }
        else
        {
            printf("%s/", g_cur_dir);
            printf("%s\n", dir->d_name);
        }
    }
    closedir(dp);
}
void usage(char state, char *str)
{
    if (state == EXIT_FAILE)
    {
        printf("\n");
    }
    else
    {
        printf("\n");
        printf("========================================\n");
        printf("read directory:\n");
        printf("\n");
        printf("Usage: %s [-r] [directory]\n\n", str);
        printf("       -r: read all files under each directory, recursively. \n");
        printf("========================================\n");
        printf("/n");
        exit(0);
    }
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved