C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[41298] Re:Memo에 디렉토리 및 파일 뿌리기 ;;
유영인 Cuperido [cuperido] 1127 읽음    2005-08-02 18:56
재귀 호출시에 Deep을 설정해 주시면 될 것 같습니다.

선언문에, 기본 Deep는 0 이 Default가 되도록 설정해 주시고,
void __fastcall TForm1::GetDirView(AnsiString Dir, int itDeep = 0);

void __fastcall TForm1::GetDirView(AnsiString Dir, int itDeep)
{
        TSearchRec sr;
        int iAttributes = 0;
        AnsiString iDir; //GetDirView()내에서만 사용할 패스변수 선언

        AnsiString stName;

        iAttributes |= faReadOnly * 0; //파일 옵션
        iAttributes |= faHidden * 0;
        iAttributes |= faSysFile * 0;
        iAttributes |= faVolumeID * 0;
        iAttributes |= faDirectory * 0;
        iAttributes |= faArchive * 0;
        iAttributes |= faAnyFile * 1;

        iDir = Dir; //인자로 받아온 패스를 iDir에 저장
        int len=iDir.Length();
        if(iDir[len]=='\\')   //iDir의 마지막 문자가 '\\'인지 아닌지
                iDir += "*.*";
        else
                iDir += "\\*.*";


        if (FindFirst(iDir, iAttributes, sr) == 0) //찾는 파일이 있으면..
        {
                do{

                 // 이 부분이 새롭게 들어갑니다. deep 만큼 tab을 추가합니다.
                  stName = "";
                  for(int itTabCount = 0; itTabCount < itDeep; itTabCount ++)
                    stName = stName + char(9);
                  stName += sr.Name;

                        if ((sr.Attr & faDirectory) == 0)//찾은 파일이 디렉토리가 아니면..
                                Memo1->Lines->Add(stName);
                        else{
                                if (sr.Name != "." && sr.Name != ".."){ // ".", ".." 두 디렉토리는 출력에서 제외시킴
                                        Memo1->Lines->Add("[DIR]  "+ stName);
                                        AnsiString subDir;
                                        subDir = Dir;
       
                                       // 이 아래 부분 \\ 이 없어서 재귀 호출 에러가 발생되더군요. :(
                                        subDir += "\\" + sr.Name;
                                        GetDirView(subDir+"\\", itDeep + 1);
                                }
                        }
                }while(FindNext(sr) == 0); //다음 파일찾기, 다음찾은 파일이 없을때까지 do-while문 반복
        }
        FindClose(sr);
}

stName에 탭을 추가 하는 부분이 파일마다 계속 반복되니,
먼저 Tab만큼 이쁘게 띄워주고 그것을 stHeader로 정의하시고
나중에 파일 안에서 헤더만큼 더해 주는 것이 속도면에서도 좋을것 같습니다.
(여기서는 간단히 속도 계산 안하고 테스트 용도로만.. ^^)


cuperido


프리지아 님이 쓰신 글 :
: 포럼 참고해서 만들어 봤습니다.
: 나름대로 잘 돌아가는데...
: 상위 디렉토리나 파일과 하위디렉토리 파일간에 구분이 안가네요 ^^;;
: [DIR]windows
:                     [DIR] Program Files
:                                          [DIR]Alzip
:                                                          [DIR]Temp                       
:                                                          Alzip.exe
: [DIR]Program Files
:
: 이런식으로 탭키로 구분을 해주거나
: 아님 Memo말고 TreeView같은걸로 더 쉽게 해줄 방법이 없을까요?
:
:
:
:
: void __fastcall TForm1::GetDirView(AnsiString Dir)
: {
:         TSearchRec sr;
:         int iAttributes = 0;
:         AnsiString iDir; //GetDirView()내에서만 사용할 패스변수 선언
:
:         iAttributes |= faReadOnly * 0; //파일 옵션
:         iAttributes |= faHidden * 0;
:         iAttributes |= faSysFile * 0;
:         iAttributes |= faVolumeID * 0;
:         iAttributes |= faDirectory * 0;
:         iAttributes |= faArchive * 0;
:         iAttributes |= faAnyFile * 1;
:
:         iDir = Dir; //인자로 받아온 패스를 iDir에 저장
:         int len=iDir.Length();
:         if(iDir[len]=='\\')   //iDir의 마지막 문자가 '\\'인지 아닌지
:                 iDir += "*.*";
:         else
:                 iDir += "\\*.*";
:
:
:         if (FindFirst(iDir, iAttributes, sr) == 0) //찾는 파일이 있으면..
:         {
:                 do{
:                         if ((sr.Attr & faDirectory) == 0)//찾은 파일이 디렉토리가 아니면..
:                                 Memo1->Lines->Add(sr.Name);
:                         else{
:                                 if (sr.Name != "." && sr.Name != ".."){ // ".", ".." 두 디렉토리는 출력에서 제외시킴
:                                         Memo1->Lines->Add("[DIR]  "+sr.Name);
:                                         AnsiString subDir;
:                                         subDir = Dir;
:                                         subDir += sr.Name;
:                                         GetDirView(subDir+"\\");
:                                 }
:                         }
:                 }while(FindNext(sr) == 0); //다음 파일찾기, 다음찾은 파일이 없을때까지 do-while문 반복
:         }
:         FindClose(sr);
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
:         Memo1->Clear();
:         GetDirView("D:\\");
: }
: //---------------------------------------------------------------------------

+ -

관련 글 리스트
41297 Memo에 디렉토리 및 파일 뿌리기 ;; 프리지아 945 2005/08/02
41298     Re:Memo에 디렉토리 및 파일 뿌리기 ;; 유영인 Cuperido 1127 2005/08/02
41302         Re:Re:감사합니다 ^^ 프리지아 709 2005/08/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.