快速业务通道

C++ Builder中目录处理的一些函数

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
           // 返回的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)
         { // 删除

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号