目录操作相关的类
根据绝对路径的文件名或目录名逐级的创建目录。
bool MKDIR(const char *pathorfilename,bool bisfilename=true);
bool MKDIR(const char *filename,bool bisfilename)
{
char strPathName[301];
int ilen=strlen(filename);
for (int ii=1; ii<ilen;ii++)
{
if (filename[ii] != '/') continue;
STRNCPY(strPathName,sizeof(strPathName),filename,ii);
if (access(strPathName,F_OK) == 0) continue;
if (mkdir(strPathName,0755) != 0) return false;
}
if (bisfilename==false)
{
if (access(filename,F_OK) != 0)
{
if (mkdir(filename,0755) != 0) return false;
}
}
return true;
}
int main()
{
MKDIR("/tmp/aaa/bbb/ccc/ddd",false);
MKDIR("/tmp/111/222/333/444/data.xml",true);
}
获取某目录及其子目录中的文件列表信息。
class CDir
{
public:
char m_DirName[301];
char m_FileName[301];
char m_FullFileName[301];
int m_FileSize;
char m_ModifyTime[21];
char m_CreateTime[21];
char m_AccessTime[21];
char m_DateFMT[25];
vector<string> m_vFileName;
int m_pos;
CDir();
void initdata();
void SetDateFMT(const char *in_DateFMT);
bool OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount=10000,const bool bAndChild=false,bool bSort=false);
bool _OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount,const bool bAndChild);
bool ReadDir();
~CDir();
};
---cpp
CDir::CDir()
{
m_pos=0;
STRCPY(m_DateFMT,sizeof(m_DateFMT),"yyyy-mm-dd hh24:mi:ss");
m_vFileName.clear();
initdata();
}
void CDir::initdata()
{
memset(m_DirName,0,sizeof(m_DirName));
memset(m_FileName,0,sizeof(m_FileName));
memset(m_FullFileName,0,sizeof(m_FullFileName));
m_FileSize=0;
memset(m_CreateTime,0,sizeof(m_CreateTime));
memset(m_ModifyTime,0,sizeof(m_ModifyTime));
memset(m_AccessTime,0,sizeof(m_AccessTime));
}
void CDir::SetDateFMT(const char *in_DateFMT)
{
memset(m_DateFMT,0,sizeof(m_DateFMT));
STRCPY(m_DateFMT,sizeof(m_DateFMT),in_DateFMT);
}
bool CDir::OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount,const bool bAndChild,bool bSort)
{
m_pos=0;
m_vFileName.clear();
if (MKDIR(in_DirName,false) == false) return false;
bool bRet=_OpenDir(in_DirName,in_MatchStr,in_MaxCount,bAndChild);
if (bSort==true)
{
sort(m_vFileName.begin(), m_vFileName.end());
}
return bRet;
}
bool CDir::_OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount,const bool bAndChild)
{
DIR *dir;
if ( (dir=opendir(in_DirName)) == 0 ) return false;
char strTempFileName[3001];
struct dirent *st_fileinfo;
struct stat st_filestat;
while ((st_fileinfo=readdir(dir)) != 0)
{
if (st_fileinfo->d_name[0]=='.') continue;
SNPRINTF(strTempFileName,sizeof(strTempFileName),300,"%s//%s",in_DirName,st_fileinfo->d_name);
UpdateStr(strTempFileName,"//","/");
stat(strTempFileName,&st_filestat);
if (S_ISDIR(st_filestat.st_mode))
{
if (bAndChild == true)
{
if (_OpenDir(strTempFileName,in_MatchStr,in_MaxCount,bAndChild) == false)
{
closedir(dir); return false;
}
}
}
else
{
if (MatchStr(st_fileinfo->d_name,in_MatchStr) == false) continue;
m_vFileName.push_back(strTempFileName);
if ( m_vFileName.size()>=in_MaxCount ) break;
}
}
closedir(dir);
return true;
}
bool CDir::ReadDir()
{
initdata();
int ivsize=m_vFileName.size();
if (m_pos >= ivsize)
{
m_pos=0; m_vFileName.clear(); return false;
}
int pos=0;
pos=m_vFileName[m_pos].find_last_of("/");
STRCPY(m_DirName,sizeof(m_DirName),m_vFileName[m_pos].substr(0,pos).c_str());
STRCPY(m_FileName,sizeof(m_FileName),m_vFileName[m_pos].substr(pos+1,m_vFileName[m_pos].size()-pos-1).c_str());
SNPRINTF(m_FullFileName,sizeof(m_FullFileName),300,"%s",m_vFileName[m_pos].c_str());
struct stat st_filestat;
stat(m_FullFileName,&st_filestat);
m_FileSize=st_filestat.st_size;
struct tm nowtimer;
if (strcmp(m_DateFMT,"yyyy-mm-dd hh24:mi:ss") == 0)
{
nowtimer = *localtime(&st_filestat.st_mtime);
nowtimer.tm_mon++;
snprintf(m_ModifyTime,20,"%04u-%02u-%02u %02u:%02u:%02u",\
nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\
nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
nowtimer = *localtime(&st_filestat.st_ctime);
nowtimer.tm_mon++;
snprintf(m_CreateTime,20,"%04u-%02u-%02u %02u:%02u:%02u",\
nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\
nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
nowtimer = *localtime(&st_filestat.st_atime);
nowtimer.tm_mon++;
snprintf(m_AccessTime,20,"%04u-%02u-%02u %02u:%02u:%02u",\
nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\
nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
}
if (strcmp(m_DateFMT,"yyyymmddhh24miss") == 0)
{
nowtimer = *localtime(&st_filestat.st_mtime);
nowtimer.tm_mon++;
snprintf(m_ModifyTime,20,"%04u%02u%02u%02u%02u%02u",\
nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\
nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
nowtimer = *localtime(&st_filestat.st_ctime);
nowtimer.tm_mon++;
snprintf(m_CreateTime,20,"%04u%02u%02u%02u%02u%02u",\
nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\
nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
nowtimer = *localtime(&st_filestat.st_atime);
nowtimer.tm_mon++;
snprintf(m_AccessTime,20,"%04u%02u%02u%02u%02u%02u",\
nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\
nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
}
m_pos++;
return true;
}
CDir::~CDir()
{
m_vFileName.clear();
}
---测试
int main(int argc,char *argv[])
{
if (argc != 2) { printf("请指定目录名。\n"); return -1; }
CDir Dir;
if (Dir.OpenDir(argv[1],"*.h,*cpp",100,true,true)==false)
{
printf("Dir.OpenDir(%s) failed.\n",argv[1]); return -1;
}
while(Dir.ReadDir()==true)
{
printf("filename=%s,mtime=%s,size=%d\n",Dir.m_FullFileName,Dir.m_ModifyTime,Dir.m_FileSize);
}
}