반응형
scandir을 이용하여, 파일리스트와 폴더리스트를 불러오는 방법이다

필수적으로,

참고 Link
fstat : http://codewiki.wikidot.com/c:system-calls:fstat
s_islnk: http://www.freepascal.org/docs-html/rtl/oldlinux/s_islnk.html

요구 include Files
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>

long_t getFileList(const str_t dir, str_t*& list)
{
     /* Scan directory */
     struct dirent** pp_item;
     struct stat fstat;

// scandir 함수를 이요해서 파일과 디렉토리 내용을 가져온다
     long_t item_cnt = scandir(".", &pp_item, NULL, alphasort);

     /* Count files */
     long_t file_cnt = 0;
//파일 개수만큼 loop를 돌린다.
     for(long_t i = 0; i < item_cnt; i++) {

//현재 폴더와 이전폴더는 무시하고
         if(!strcmp(pp_item[i]->d_name, ".") || !strcmp(pp_item[i]->d_name, "..")) continue;

         lstat(pp_item[i]->d_name, &fstat);
//Regular file과 Simbolic Link file일 경우
         if(S_ISREG(fstat.st_mode) || S_ISLNK(fstat.st_mode)) file_cnt++;
     }

     /* Allocate memory */
     str_t* pp_list;
     pp_list = new str_t [file_cnt];

     /* Copy the filenames to list */
     long_t index = 0;
     for(long_t i = 0; i < item_cnt; i++) {
         if(!strcmp(pp_item[i]->d_name, ".") || !strcmp(pp_item[i]->d_name, "..")) {
             free(pp_item[i]);
             continue;
         }

         lstat(pp_item[i]->d_name, &fstat);
         if(S_ISREG(fstat.st_mode) || S_ISLNK(fstat.st_mode)) {
             pp_list[index] = new char_t [strlen(pp_item[i]->d_name) + 1];
             strcpy(pp_list[index], pp_item[i]->d_name);

             index++;
         }
         free(pp_item[i]);
     }
     free(pp_item);

     list = pp_list;

     return file_cnt;
}
반응형

+ Recent posts