//    폴더목록 출력(하위 디렉토리 포함)

#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <map>
#include <iterator>
#include <string>
#include <fstream>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <strings.h>
#include <memory.h>
#include <stdlib.h>

using namespace std;

typedef map<string, bool> FILE_LIST;

class CFileList
{
public:
    CFileList();
    ~CFileList();

public:
    bool GetFileList(FILE_LIST& list, string strDir); //디렉토리 및 파일목록을 구한다
    void ShowFileList(FILE_LIST& list);//리스트를 출력한다
};

CFileList::CFileList()
{
}

CFileList::~CFileList()
{
}

bool CFileList::GetFileList(FILE_LIST& list, string strDir)
{
    struct stat statinfo;
    memset(&statinfo, 0, sizeof(statinfo));
    lstat(strDir.c_str(), &statinfo);
    if(!S_ISDIR(statinfo.st_mode))
    {
        cout<<strDir + " is not directory"<<endl;
        return false;
    }

    DIR *dir;
    struct dirent *entry;

     if ((dir = opendir(strDir.c_str())) == NULL)
     {
         cout<<strDir + " open error"<<endl;
        return false;
     }

    while ((entry = readdir(dir)) != NULL)
    {
        memset(&statinfo, 0, sizeof(statinfo));
        string strFilePath = strDir + "/" + entry->d_name;
        while(strFilePath.find("//") != string::npos)
                strFilePath.replace(strFilePath.find("//"), 2, "/");

        lstat(strFilePath.c_str(), &statinfo);

        if(S_ISDIR(statinfo.st_mode)) // 디렉토리 이면
        {
            if(strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
                continue;


            list.insert(pair<string, bool>(strFilePath, true)); //디렉토리 경로를 넣음

            string strSubDir = strDir + "/" + entry->d_name;
            GetFileList(list, strSubDir); //디렉토리 안으로 들어감
        }
        else
        {
            //파일이면
            list.insert(pair<string, bool>(strFilePath, false)); //파일경로를 넣음
        }
    }

    //읽은 디렉토리 닫기
     closedir(dir);

    return true;
}

void CFileList::ShowFileList(FILE_LIST& list)
{
    FILE_LIST::iterator itr;
    for(itr = list.begin(); itr != list.end(); itr++)
    {
        if ( itr->second == true )
            cout<<"[DIRECTORY] " + itr->first<<endl;
        else
            cout<<"[FILE] " + itr->first<<endl;
    }
}

int main(int argc, char* argv[])
{
    if(argc != 2)
    {
        cout<<"usage: filelist [directory path]"<<endl;
        return 1;
    }

    CFileList FileList;

    string strSrcDir = argv[1];

    FILE_LIST file_list;

    FileList.GetFileList(file_list, strSrcDir);
    FileList.ShowFileList(file_list);

    return 0;
}

//    현재폴더 목록만 출력하는 소스

#include <stdio.h>
#include <unistd.h>
#include <dirent.h>


int main()
{
     DIR            *dir_info;
    struct dirent  *dir_entry;

    dir_info = opendir( ".");              // 현재 디렉토리를 열기
    if ( NULL != dir_info)
    {
        while( dir_entry   = readdir( dir_info))  // 디렉토리 안에 있는 모든 파일과 디렉토리 출력
        {
            printf( "%s\n", dir_entry->d_name);
        }
        closedir( dir_info);
    }
}



+ Recent posts