// 返回的ItemID占用了系统资源,不要忘了释放 }
三、直接建立多级目录:
Windows API提供了建立目录的函数CreateDirectory,但是调用前要保证父目录必须存在,否则会失败。其实,有时越级建立多级目录很有用,因为在建立目录特别是建立多层目录时,层层加以判断会大大地增加程序的复杂程度。如何实现这个功能呢?本人用递归方法设计了一个可以直接建立多级目录的函数,现说明如下,供各位朋友参考。
bool MakeDirectoryEx(const AnsiString &P) // 入参为打算创建的目录名,根据操作结果返回"true"或"false" { if(P.IsEmpty())return false; int len=P.Length(); char *Path=P.c_str(); if(Path[len-1]==''\\'') { len--; Path[len]=''\0''; } // 删除末尾的"\" AnsiString Dir=Path; // 分开父目录和本身目录名称 AnsiString Parent; for(int i=len-1;i>0;i--) { if(Dir.IsPathDelimiter(i)) { Parent=Dir.SubString(0,i); break; } } if(Parent.IsEmpty())return false; // 目录名称错误 bool Ret=true; if(Parent.Length()>3) // 如果长度小于3,表示为磁盘根目录 Ret=DirectoryExistEx(Parent.c_str());// 检查父目录是否存在 if(!Ret)Ret=MakeDirectoryEx(Parent); // 父目录不存在,递归调用创建父目录 if(Ret) // 父目录存在,直接创建目录 { SECURITY_ATTRIBUTES sa; sa.nLength=sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor=NULL; sa.bInheritHandle=0; Ret=CreateDirectory(Path,&sa); } return Ret; }
可以看出基本方法是:
先检查父目录是否存在,这里用到的函数DirectoryExistEx可以按照前面介绍的方法设计;
如果父目录存在,则直接创建目录,否则自我调用创建父目录。
四、直接删除整个目录:
在DOS下有一个Deltree命令,用来删除整个目录,这是一个很有用的功能,可惜,Windows API提供的函数RemoveDirectory只能删除控目录,就像DOS的RD命令一样。编程实现这个功能同样需要递归方法,基本流程是:
查找目录下的所有文件和目录,即调用API函数FindFirstFile、FindNextFile(*.*)
如果找到文件,则强制删除。所谓强制删除,即删除前先调用SetFileAttributes把它的属性设置为Normal,然后调用DeleteFile删除它。
如果找到目录,则进行自我调用,即开始递归过程。
如果没有找到目录,即表示为控目录,调用RemoveDirectory直接删除。
具体程序代码如下:
bool DeleteDirectoryEx(const AnsiString &P) { if(P.IsEmpty() || P.Length()<4)return false; // 参数长度必须大于3,即不能为磁盘根目录或空白 int len=P.Length(); char *Path=P.c_str(); AnsiString Dir=Path; if(Path[len-1]!=''\\'')Dir=Dir+''\\''; AnsiString Files=Dir+"*.*"; WIN32_FIND_DATA wfd; HANDLE hFind=FindFirstFile(Files.c_str(),&wfd); bool Ret=true; AnsiString Tmp; if(hFind!=INVALID_HANDLE_VALUE) { bool bFind=true; while(bFind) { if(wfd.cFileName[0]!=''.'') // . .. { Tmp=Dir+wfd.cFileName; if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // 删除
|