Kód Multiplatformní výpis souborů v adresáři v CPP

Z CHWiki

Přejít na: navigace, hledání

Multiplatformní knihovna pro výpis souborů v zadaném adresáři:

[editovat] Knihovna

// Copyleft (c) 2005 Marek Olsak       <eosiecoder@gmail.om>
// Platform independent file searching.
#pragma once

#ifdef WIN32
    #include <io.h>

    #define FIND_INVALID	-1
    #define find_dir_t		long
    #define find_data_t		_finddata_t

    inline find_dir_t find_first(const char *path, find_data_t *fd)
    {
        char *str = (char*)malloc(strlen(path)+5);
        strcpy(str, path);
        strcat(str, "/*.*");
        find_dir_t dp = (long)_findfirst(str, fd);
        free(str);
        return dp;
    }

    #define find_next 		_findnext
    #define find_close 		_findclose
    #define find_getfile(f)	(f).name
    #define find_isdir(f)	(((f).attrib & _A_SUBDIR) != 0)

#else // UNIX systems
    #include <stddef.h>
    #include <sys/types.h>
    #include <dirent.h>

    #define FIND_INVALID	0

    typedef DIR *find_dir_t;
    typedef struct dirent *find_data_t;

    inline find_dir_t find_first(const char *path, find_data_t *fd)
    {
        char *str = (char*)malloc(strlen(path)+2);
        strcpy(str, path);
        strcat(str, "/");
        find_dir_t dp = opendir(str);
        free(str);
        if (dp) *fd = readdir(dp);
        return dp;
    }

    #define find_next(d,f)	((*(f)) = readdir(d))
    #define find_close		closedir
    #define find_getfile(f)	(f)->d_name
    #define find_isdir(f)	((f)->d_type == DT_DIR)
#endif

[editovat] Ukázkový kód

int main(int argc, char **argv)
{
    find_dir_t dir;
    find_data_t fd;

    dir = find_first(".", &fd);
    if (dir != FIND_INVALID)
    {
        do
        {
            printf("%s\t%s\n", (find_isdir(fd))? "<DIR>" : "     ", find_getfile(fd));
        }
        while (find_next(dir, &fd) != FIND_INVALID);
        find_close(dir);
    }

    getchar();
    return 0;
}

[editovat] Výstup programu

<DIR>   .
<DIR>   ..
        findfiles.h
        main.cpp