|
더운데 수고많으시네요~
항상 도움만 받네요
저도 어여 다른분들께 도움이될 실력을 키워야 겠어요 ㅋㅋ
유영인 Cuperido 님이 쓰신 글 :
: 재귀 호출시에 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:\\");
: : }
: : //---------------------------------------------------------------------------
|