在编程的时候,我们经常会需要生成一些文件,而这些文件为了方便管理,会创建多级目录,有的时候文件所在的目录没有创建,比较麻烦,直接上代码
#ifdef WIN32
// 核查目录,若目录不存在,创建目录
bool GF_FindOrCreateDirectory( const char* pszPath )
{
WIN32_FIND_DATA fd;
HANDLE hFind = ::FindFirstFile( pszPath, &fd );
while( hFind != INVALID_HANDLE_VALUE )
{
if ( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
::FindClose(hFind);
return true;
}
}
if ( !::CreateDirectory( pszPath, NULL ) )
{
char szDir[MAX_PATH];
sprintf_s( szDir, sizeof(szDir), "创建目录[%s]失败,请检查权限", pszPath );
::FindClose(hFind);
return false;
}
::FindClose(hFind);
return true;
}
// 遍历目录
bool GF_CheckDirectory( char* pszFilePath )
{
char pszPath[4096];
strcpy(pszPath,pszFilePath);
(strrchr(pszPath,'\\'))[1] = 0;
vector< std::string > vtPath;
const char* sep = "\\/";
char* next_token;
char* token = strtok_s( pszPath, sep, &next_token);
while( token != NULL )
{
vtPath.push_back( token );
token = strtok_s(NULL, sep, &next_token);
}
if ( vtPath.size() > 0 )
{
if ( vtPath[0] == "." )
vtPath.erase( vtPath.begin() );
}
// 核查所有路径是否存在
std::string strCurPath;
for( size_t i = 0; i < (int)vtPath.size(); ++i )
{
strCurPath += vtPath[i];
if ( !GF_FindOrCreateDirectory( strCurPath.c_str() ) )
{
return false;
}
strCurPath += '\\';
}
return true;
}
#else
// 核查目录,若目录不存在,创建目录
bool GF_FindOrCreateDirectory( const char* pszPath )
{
DIR* dir;
if(NULL==(dir=opendir(pszPath)))
mkdir(pszPath,0775);
closedir(dir);
return true;
}
// 检测文件路径中的目录是否存在,不存在则创建
bool GF_CheckDirectory( char* pszFilePath )
{
char pszPath[4096];
strcpy(pszPath,pszFilePath);
(strrchr(pszPath,'/'))[1] = 0;
vector< std::string > vtPath;
const char* sep = "\\/";
char* next_token;
char* token = strtok_r( pszPath, sep, &next_token);
while( token != NULL )
{
vtPath.push_back( token );
token = strtok_r(NULL, sep, &next_token);
}
if ( vtPath.size() > 0 )
{
if ( vtPath[0] == "." )
vtPath.erase( vtPath.begin() );
}
// 核查所有路径是否存在
std::string strCurPath;
for( size_t i = 0; i < (int)vtPath.size(); ++i )
{
strCurPath += '/';
strCurPath += vtPath[i];
if ( !GF_FindOrCreateDirectory( strCurPath.c_str() ) )
{
return false;
}
}
return true;
}
#endif