|
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;
: }
: }
|