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
[36854] Re:디렉터리 탐색(스캔)과 AnsiString의 c_str()
임문환.실업자 [origin] 1157 읽음    2004-08-19 10:25
if(*sr.Name.c_str() != '.')
sr은 TSearchRec 구조체의 인스턴스이고 sr.Name는 AnsiString 형입니다.
AnsiString의 c.str() 메서드는 해당 인스턴스가 가지고 있는 문자열의 선두 번지를(char*)를 반환합니다.
즉, char* p=sr.Name.c_str();이 가능합니다.
문자열을 가리키는 포인터의 경우 *p를 하면 p의 번지에 있는 문자를 반환합니다.
배열로 말하자면, *p는 p[0]이 됩니다.

주의할것은, AnsiString의 c_str()이 반환하는 포인터는 해당 AnsiString 인스턴스의 내부버퍼를 새로 할당해야 하는 경우가 발생하면(즉, 기존과 다른 위치의 메모리에 버퍼를 새로 잡는 경우) 더이상 원본과 동일한 위치를 가리키지 않게 됩니다. 

if(*sr.Name.c_str() != '.') 에서 '.'과 비교를 했는데  디렉터리 이름에서 "."는 현재 디렉터리를 말하고 ".."는 부모 디렉터리를 말합니다.
예를 들어, 현재 디렉터리가 c:\Windows라면 "."는 c:\Windows를, ".."는 c:\를 말합니다.
그리고, 위 둘 외에는 '.'로 시작하는 디렉터리 이름은 있을 수 없습니다.
결국, '.'로 시작하는 디렉터리 이름은 스캔하면 안 됩니다. 그 것을 스캔하면 무한 루프에 빠지게 됩니다.


최진호 님이 쓰신 글 :
: 여기에 올라온 알고리즘을 쓰고있는데...
:
: 애해가 가지 않는 부분이 있어서..물어봅니다..
: 다른것은 알겠는데...
: 아래 부분은 이해가 가지 않네요..
: 답변좀 부탁드립니다..
: 특히 이부분
: if(*sr.Name.c_str() != '.')
:

:
:
:
:
:
: 작성자 : Julien  (julien)  읽음 : 180    2003-05-30 오후 6:25:52

: 서브디렉토리들까지 주욱 스캔하는 예제에 대한 질문이 가끔씩 올라오는 것 같아 하나 만들어봤습니다.

:
: recursive로 디렉토리를 스캔해서 Memo에 붙이는 예제입니다.
: Memo에 add하는 부분을 파일을 이동하는 것으로 수정해 보세요.
: 그럼 원하는 것을 얻을 수 있습니다.
: 참고로 아시겠지만 디렉토리를 삭제할 때는 안에 있는 파일부터 지워야합니다.
:
: void __fastcall TForm1::DirRecursiveScan(String path)
: {
:   try
:   {
:     if(String(path.AnsiLastChar()) != "\\") path += "\\";
:     String fpath;
:     TSearchRec sr;
:     int Found = FindFirst(path + "*.*", faArchive | faDirectory, sr);
:     while(Found == 0)
:     {
:       fpath = path + sr.Name;                                                        / /*
:       if(*sr.Name.c_str() != '.')
:       {
:         if(DirectoryExists(fpath)) DirRecursiveScan(fpath);           *//
:         else Memo1->Lines->Add(fpath);
:       }
:       Found = FindNext(sr);
:     }
:     FindClose(sr);
:   }
:   catch(Exception *e)
:   {
:     throw e;
:   }
: }

+ -

관련 글 리스트
36852 한가지 이해 안하는 부분 최진호 765 2004/08/19
36854     Re:디렉터리 탐색(스캔)과 AnsiString의 c_str() 임문환.실업자 1157 2004/08/19
36865         감사합니다.. 최진호 649 2004/08/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.