[Win32]현재 디렉토리 내 모든 파일 리스트 만들기

2023. 3. 16. 19:51프로그래밍

728x90

현재 디렉토리 내에 있는 모든 파일만 표시 해 보기

좀 어줍잖게 짜기 해도 뭐...윈도우 용이므로 *NIX 계열은 아님

상수로 검색할 디렉토리를 아규먼트로 받아서 처리 한다.

bool searchFilesDirectory(const char *sDir)
{
	WIN32_FIND_DATA fdFile;
    HANDLE hFind = NULL;

    char sPath[2048];
    char buffer [10240];
    if(!sDir) return false;
    
	sprintf(sPath, "%s\\*.*", sDir);
	
    if((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE)
    {
        LOG_TRACE(LOG_ERROR, "2.Path not found: %s\n", sDir);
        return false;
    }
		
    do
    {
        if(strcmp(fdFile.cFileName, ".") != 0
			&& strcmp(fdFile.cFileName, "..") != 0)
		{
			sprintf(sPath, "%s\\%s", sDir, fdFile.cFileName);
			
			if(fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				searchDirectory(sPath); //Recursion, I love it!
            }
            else
            {
            	memset(buffer, 0x00, sizeof(buffer));
	           	std::string cppPath(sPath);
	           	
	           if (FileDBMgr->ptrWNoSqlDB()->set(UtilW32::base64_encode(reinterpret_cast<const unsigned char*>(sPath), strlen(sPath)), cppPath))
				{
			
					fileCnt++;
					
					if(((fileCnt % PRINT_CNT) == 0))
					{	
						LOG_TRACE(LOG_INFO, ".");
						lineCnt++;
					}
				}
            }
           
		}
    }
    while(FindNextFile(hFind, &fdFile)); 
	
    FindClose(hFind); 
 
    return true;
}
 

:사용법

다음은 connstrct 라는 구조체의 포인터를 받아는 데 여기에 들어 가 있는 것이 delimiter로 콤마가 찍힌 리스트를 받아서 해당 delimiter를 짤라서 하나씩 순환하면서 파일을 찍어 보는 함수이다.

소스 코드에서 보면 뜬금없는 코드가 보이는 데,

FileDBMgr->openWNoSql(constr);
FileDBMgr->closeWNoSql();
FileDBMgr->ptrWNoSqlDB()->set(...);
 

이는 Kyotocabinet 이라는 Nosql 데이터베이스를 사용해서 파일리스트를 저장하는 로직에서 떼어다 붙인 것이다.

bool makePhysicalFileList(connstrct *constr)
{
	char** tokens = NULL;
	FileDBMgr->openWNoSql(constr);
	
	tokens = str_split(constr->searchpath, ',');

    if (tokens)
    {
        int i;
        char *sDir = NULL;
        
        for (i = 0; (sDir = *(tokens + i)); i++)
        {
            if(!sDir) break;
            
            if(UtilW32::DirExists(sDir))
            {
            	//cout << "directory=" << sDir << endl;
            	LOG_TRACE(LOG_ERROR, "\nsDir %s \n", sDir);
            	searchDirectory(sDir);
            	free(sDir);
            	sDir = NULL;
            }
        }
        free(tokens);
        LOG_TRACE(LOG_ERROR, "\r\n");
    }
	
	FileDBMgr->closeWNoSql();
	
	
	cout << "Total count = " << fileCnt << endl;
}
 
 

이상.

 

728x90