|
재귀 호출시에 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:\\");
: }
: //---------------------------------------------------------------------------
|