c语言之ls目录的简单实现和window版本dirent.h

来源:互联网 发布:淘宝宝贝卖点是什么 编辑:程序博客网 时间:2024/06/06 02:42
#include <stdio.h>#if _WIN32#include <Windows.h>#include <io.h>#include "dirent.h"#else#include <unistd.h>#include <dirent.h>#endif//window 下载http://www.softagalleria.net/download/dirent/dirent-1.21.zipint main(int argc, char *argv[]){    DIR *dir;    struct dirent* mydirent;    if(argc!=2)    {        printf("usage:directory_name");        return -1;    }    if((dir=opendir(argv[1]))!=NULL)    {        while((mydirent=readdir(dir))!=NULL)        {            printf("%s \n",mydirent->d_name);        }    }else{        printf("cannot open %s",argv[1]);        return -1;    }    closedir(dir);    return 0;}

/* * An example demonstrating recursive directory traversal. * * Compile this file with Visual Studio 2008 project vs2008.sln and run * the produced command in console with a directory name argument.  For * example, command * *     find "C:\Program Files" * * might produce a listing with thousands of entries such as * *     c:\Program Files/7-Zip/7-zip.chm *     c:\Program Files/7-Zip/7-zip.dll *     c:\Program Files/7-Zip/7z.dll *     c:\Program Files/Adobe/Reader 10.0/Reader/logsession.dll *     c:\Program Files/Adobe/Reader 10.0/Reader/LogTransport2.exe *     c:\Program Files/Windows NT/Accessories/wordpad.exe *     c:\Program Files/Windows NT/Accessories/write.wpc * * The find command provided by this file is only an example.  That is, * the command does not provide options to restrict the output to certain * files as the Linux version does. * * Copyright (C) 2006-2012 Toni Ronkko * This file is part of dirent.  Dirent may be freely distributed * under the MIT license.  For all details and documentation, see * https://github.com/tronkko/dirent */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <dirent.h>static int find_directory (const char *dirname);intmain(    int argc, char *argv[]) {    int i;    int ok;    /* For each directory in command line */    i = 1;    while (i < argc) {        ok = find_directory (argv[i]);        if (!ok) {            exit (EXIT_FAILURE);        }        i++;    }    /* List current working directory if no arguments on command line */    if (argc == 1) {        find_directory (".");    }    return EXIT_SUCCESS;}/* Find files and subdirectories recursively */static intfind_directory(    const char *dirname){    DIR *dir;    char buffer[PATH_MAX + 2];    char *p = buffer;    const char *src;    char *end = &buffer[PATH_MAX];    int ok;    /* Copy directory name to buffer */    src = dirname;    while (p < end  &&  *src != '\0') {        *p++ = *src++;    }    *p = '\0';    /* Open directory stream */    dir = opendir (dirname);    if (dir != NULL) {        struct dirent *ent;        /* Print all files and directories within the directory */        while ((ent = readdir (dir)) != NULL) {            char *q = p;            char c;            /* Get final character of directory name */            if (buffer < q) {                c = q[-1];            } else {                c = ':';            }            /* Append directory separator if not already there */            if (c != ':'  &&  c != '/'  &&  c != '\\') {                *q++ = '/';            }            /* Append file name */            src = ent->d_name;            while (q < end  &&  *src != '\0') {                *q++ = *src++;            }            *q = '\0';            /* Decide what to do with the directory entry */            switch (ent->d_type) {            case DT_LNK:            case DT_REG:                /* Output file name with directory */                printf ("%s\n", buffer);                break;            case DT_DIR:                /* Scan sub-directory recursively */                if (strcmp (ent->d_name, ".") != 0                          &&  strcmp (ent->d_name, "..") != 0) {                    find_directory (buffer);                }                break;            default:                /* Ignore device entries */                /*NOP*/;            }        }        closedir (dir);        ok = 1;    } else {        /* Could not open directory */        printf ("Cannot open directory %s\n", dirname);        ok = 0;    }    return ok;}

/*  * An example demonstrating basic directory listing. * * Compile this file with Visual Studio 2008 project vs2008.sln and run the * produced command in console with a directory name argument.  For example, * command * *     ls "c:\Program Files" * * might output something like * *     ./ *     ../ *     7-Zip/ *     Internet Explorer/ *     Microsoft Visual Studio 9.0/ *     Microsoft.NET/ *     Mozilla Firefox/ * * The ls command provided by this file is only an example.  That is, the * command does not have any fancy options like "ls -al" in Linux and the * command does not support file name matching like "ls *.c". * * Copyright (C) 2006-2012 Toni Ronkko * This file is part of dirent.  Dirent may be freely distributed * under the MIT license.  For all details and documentation, see * https://github.com/tronkko/dirent */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <dirent.h>static void list_directory (const char *dirname);intmain(        int argc, char *argv[]){    int i;    /* For each directory in command line */    i = 1;    while (i < argc) {        list_directory (argv[i]);        i++;    }    /* List current working directory if no arguments on command line */    if (argc == 1) {        list_directory (".");    }    return EXIT_SUCCESS;}/* * List files and directories within a directory. */static voidlist_directory(        const char *dirname){    DIR *dir;    struct dirent *ent;    /* Open directory stream */    dir = opendir (dirname);    if (dir != NULL) {        /* Print all files and directories within the directory */        while ((ent = readdir (dir)) != NULL) {            switch (ent->d_type) {            case DT_REG:                printf ("%s\n", ent->d_name);                break;            case DT_DIR:                printf ("%s/\n", ent->d_name);                break;            case DT_LNK:                printf ("%s@\n", ent->d_name);                break;            default:                printf ("%s*\n", ent->d_name);            }        }        closedir (dir);    } else {        /* Could not open directory */        printf ("Cannot open directory %s\n", dirname);        exit (EXIT_FAILURE);    }}


源码:

window下载http://www.softagalleria.net/download/dirent/dirent-1.21.zip 



0 0