来到公司实习之后,代码就从之前的为了功能而写代码改为从设计出发写代码。
最近在做一个文件读取的功能,需求很简单:读取某个文件夹内所有的文件。
那么,首当其冲要面临的问题,就是列举所有文件。
经过一系列选择之后,我选择了以下的方法:
事情过去的太久远了,好多步骤也忘记了。以后想到什么要马上写下来记录才行。
int KG_GetChildDirPath(const wchar_t *pcszDirectory, KG_FILE_LIST *pFileList)
{
int nResult = false;
int nRetCode = false;
wchar_t szFindDirectory[MAX_PATH];
wchar_t szChildDirectory[MAX_PATH];
wchar_t szResultDirectory[MAX_PATH];
HANDLE hFile= 0;
WIN32_FIND_DATA FindData;
wchar_t *pszTempPath = NULL;
KG_ASSERT_EXIT(pcszDirectory);
KG_ASSERT_EXIT(pFileList);
ZeroMemory(szFindDirectory, sizeof(szFindDirectory));
ZeroMemory(szChildDirectory, sizeof(szChildDirectory));
ZeroMemory(szResultDirectory, sizeof(szResultDirectory));
nRetCode = swprintf(
szFindDirectory, countof(szFindDirectory), L"%ls/*.*", pcszDirectory
);
KG_PROCESS_ERROR(nRetCode > 0 && nRetCode < countof(szFindDirectory) - 1);
nRetCode = swprintf(
szResultDirectory, countof(szResultDirectory), L"%ls", pcszDirectory
);
KG_PROCESS_ERROR(nRetCode > 0 && nRetCode < countof(szResultDirectory) - 1);
hFile= FindFirstFile(szFindDirectory, &FindData);
KG_PROCESS_ERROR(hFile != INVALID_HANDLE_VALUE);
for (;;)
{
nRetCode = FindNextFile(hFile, &FindData);
//KG_PROCESS_ERROR(nRetCode);
// Is the last file
if (!nRetCode)
break;
//Ignore "." and ".."
if (FindData.cFileName[0] == '.' &&
FindData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
if (FindData.cFileName[1] == '\0' ||
(FindData.cFileName[1] == '.' &&FindData.cFileName[2] == '\0'))
continue;
}
// Find a directory
if(FindData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
nRetCode = swprintf(
szChildDirectory,
countof(szChildDirectory),
L"%s/%s",
pcszDirectory,
FindData.cFileName
);
KG_PROCESS_ERROR(nRetCode > 0 && nRetCode < countof(szChildDirectory) - 1);
//Recursive
nRetCode = KG_GetChildDirPath(szChildDirectory, pFileList);
KG_PROCESS_ERROR(nRetCode);
continue;
}
//Push the filename to the list
pszTempPath = new wchar_t[KG_STRING_LEN];
KG_PROCESS_ERROR(pszTempPath);
nRetCode = swprintf(
pszTempPath,
KG_STRING_LEN,
L"%ls/%ls",
szResultDirectory,
FindData.cFileName
);
KG_PROCESS_ERROR(nRetCode > 0 && nRetCode < KG_STRING_LEN - 1);
pFileList->push_back(pszTempPath);
}
nResult = true;
Exit0:
if (!nResult)
KG_DELETE_ARRAY(pszTempPath);
return nResult;
}