文章类型: VC&C++
关键词: vc++,VC,path,null,delete,api,c,C++
内容摘要: vc++文件目录的删除

vc++文件目录的删除

2017/8/30 13:41:23    来源:apple    阅读:

项目中突然要使用删除文件的功能,于是看看书,网上找找资料,总结了一些方法,其实都很简单的。希望对大家有帮助:


第一种方法:   定义一个文件类对象来操作

CFile TempFile;   

TempFile.Remove(指定文件名);


第二种方法:

使用系统函数 DeleteFile( LPCSTR filename )删除文件    _rmdir(),

删除目录 DeleteDirectory(sTempDir);

删除目录 RemoveDirectory(sTempDir);

删除目录eg:  DeleteFile(char *tempFileName);  


上面提到的删除目录的方法只能删除空目录(即文件夹),如果目录下有文件或者子目录,就不能删除了,VC里好像没有直接的函数,只能手动写个函数来删除了:


【问题】怎样删除一个非空目录,及其目录里面所有内容:

【解答1】如果不进行递归删除。你可以使用API函数SHFileOperation,它可以一次删除目录及其下面的子目录和文件。

示例代码:  

BOOL DelTree(LPCTSTR lpszPath)

{

    SHFILEOPSTRUCT FileOp;

    FileOp.fFlags = FOF_NOCONFIRMATION;

    FileOp.hNameMappings = NULL;

    FileOp.hwnd = NULL;

    FileOp.lpszProgressTitle = NULL;

    FileOp.pFrom = lpszPath;

    FileOp.pTo = NULL;

    FileOp.wFunc = FO_DELETE;

    return SHFileOperation(&FileOp) == 0;

}


【解答2】使用递归调用,逐个删除:

示例代码:

BOOL DeleteDirectory(char *DirName)//如删除 DeleteDirectory("c://aaa")

{

      CFileFind tempFind;

      char tempFileFind[MAX_PATH];

      sprintf(tempFileFind,"%s//*.*",DirName);

      BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);

      while(IsFinded)

      {

          IsFinded=(BOOL)tempFind.FindNextFile();

          if(!tempFind.IsDots())

          {

              char foundFileName[MAX_PATH];

              strcpy(foundFileName,tempFind.GetFileName().GetBuffer(MAX_PATH));

              if(tempFind.IsDirectory())

              {

                  char tempDir[MAX_PATH];

                  sprintf(tempDir,"%s//%s",DirName,foundFileName);

                  DeleteDirectory(tempDir);

              }

              else

              {

                  char tempFileName[MAX_PATH];

                  sprintf(tempFileName,"%s//%s",DirName,foundFileName);

                  DeleteFile(tempFileName);

              }

          }

      }


      tempFind.Close();


      if(!RemoveDirectory(DirName))

      {

          MessageBox(0,"删除目录失败!","警告信息",MB_OK);//比如没有找到文件夹,删除失败,可把此句删除

          return FALSE;

      }

      return TRUE;

}


//删除文件夹目录(非空)

bool DeleteDirectory(char* sDirName)

{

     CFileFind tempFind;


    char sTempFileFind[200] ;


    


     sprintf(sTempFileFind,"%s/*.*",sDirName);


     BOOL IsFinded = tempFind.FindFile(sTempFileFind);  


    while (IsFinded)


    ...{  


         IsFinded = tempFind.FindNextFile();


        


        if (!tempFind.IsDots())


        ...{  


            char sFoundFileName[200];


           strcpy(sFoundFileName,tempFind.GetFileName().GetBuffer(200));

            if (tempFind.IsDirectory())  


            ...{  


                char sTempDir[200];


                 sprintf(sTempDir,"%s/%s",sDirName,sFoundFileName);


                 DeleteDirectory(sTempDir);  


             }


            else


            ...{  


                char sTempFileName[200];


                 sprintf(sTempFileName,"%s/%s",sDirName,sFoundFileName);


                 DeleteFile(sTempFileName);  


             }


         }


     }


     tempFind.Close();


    if(!RemoveDirectory(sDirName))  


    ...{  


        return FALSE;


     }


    return TRUE;


}


/**//////////////////////////////////////////

//下面是应用,CString m_strDir 是一个文件夹路径,如:d:downloadpic

BOOL DelAll()


...{


    if(PathFileExists(m_strDir))

        DeleteDirectory((LPSTR)(LPCTSTR)m_strDir);

    return 1;

}

↑ 上一篇文章:error C2011: “LockTypeEnum”: “enum”类型重定义 关键词:error,C2011:,“LockTypeEnum”:.. 发布日期:2017/8/30 13:35:44
↓ 下一篇文章:微软常用运行库合集 2017.08.24 关键词:VC,微软,常用,运行库,合集,,2017.08.24,.. 发布日期:2017/8/30 13:46:36
相关文章:
vc++调试出现输入框:please enter the path for DBGHEAP.C的解决办法 关键词:vc++,调试出现输入框,please,enter,the,path,for,DBGHEAP.C.. 发布日期:2017-08-31 11:48
VC++中delete和delete[] 的区别 关键词:VC++,delete,delete【】,区别 发布日期:2017-08-30 14:56
VC++下使用ADO编写ACCESS数据库程序 关键词:Access,数据库,vc++,null,table,sql,command 发布日期:2016-09-21 14:11
相关目录:.NETVC&C++软件开发
我要评论
正在加载评论信息......