• MFC 中 删除一个非空文件夹


    MFC中提供了删除文件夹的一个封装函数 RemoveDirectory(LPCTSTR lpPathName),我们只要把要删除的文件夹的路径传进去就可以删除了,貌似一切如此简单。我象征性的建立一个文件夹,然后在程序中删除了它,呵呵,一下就成功了。正当我要转手去做另外的操作时,我喜欢乱尝试的毛病就鬼使神差的让我做了这么一件事,在这个文件夹下我添加了几个新的子文件夹以及一些文件,这下我再试我的程序时就出现问题了,删不掉了!!

          原来-------RemoveDirectory(LPCTSTR lpPathName)欺骗了我,他只能删除空的文件夹,这下我有问题了,怎么才能删除一个文件夹,即便其中含有无数的子文件和子文件夹呢?

         RemoveDirectory(LPCTSTR lpPathName) 的这种行为其实是情有可原的,它为我们的操作提供了一种安全级别的控制。

         但我现在就想删除非空文件夹 , 怎么办呢????

        递归删除!!

         看到论坛上有人提出这一思想,我感觉很有道理,于是就基于这一思想,着手实现它!

         首先将文件夹下所有内容删除,再调用RemoveDirectory(LPCTSTR lpPathName)不就可以实现了么!!

         为此我专门写了一个函数来递归删除一个文件夹下的所有内容!

         请看我的代码

    void myDeleteDirectory(CString directory_path)   //删除一个文件夹下的所有内容
    {   
        CFileFind finder;
        CString path;
        path.Format("%s/*.*",directory_path);
        BOOL bWorking = finder.FindFile(path);
        while(bWorking){
            bWorking = finder.FindNextFile();
            if(finder.IsDirectory() && !finder.IsDots()){//处理文件夹
                myDeleteDirectory(finder.GetFilePath()); //递归删除文件夹
                RemoveDirectory(finder.GetFilePath());
            }
            else{//处理文件
                DeleteFile(finder.GetFilePath());
            }
        }
    }

     定义一个 CFileFind 类对象 来找文件夹下的所有子文件和子文件夹,然后依次判断它是 文件 还是 文件夹,

         如果是文件 就直接删除了,如果是文件夹就递归调用 该 myDeleteDirectory()函数,来删除其内容。然后在调用RemoveDirectory()来删除这个文件夹,这样不就好了么?

          为了测试我的程序是否是正确的,我创建了一个文件夹 ForVcTest,在其中添加了许多的子文件和文件夹,又在子文件夹中添加了文件和文件夹。写了这么一段测试程序,诸位请看:

    void DeleteAllDirectory() //删除文件夹  包括非空的文件夹
    {
        //第一步 删除 该文件夹下所有文件
          myDeleteDirectory("C:/ForVcTest");
        
        //第二步 删除该空文件夹
         RemoveDirectory("C:/ForVcTest");
    }

       测试结果出来了,我眼看着一个内容丰富的文件夹,就在我的程序运行后消失了!真是很舒心啊!

    摘自http://blog.csdn.net/JarvisChu/article/details/5781100

    MFC利用CFileFind 类实现文件夹的复制

    实现文件复制过程时,一个问题i是我纠结了许久,CFileFind 类的成员函数 GetFilePath()与GetFileName(),其实很好理解的两个函数,一个是获得文件的路径,一个是获得文件的名字。但我却在理解上犯了一个错误,就是文件路径究竟包不包含文件名字,如有文件C:/Test/1.txt ,那么它的路径和名称分别是什么?我理解成了,路径:C:/Test 名称1.txt ,我按照我的理解编写这个复制功能的实现代码,老师出错,最后我才发现,原来 路径是包含文件名称的 ,即上面的文件 路径即是:C:/Test/1.txt。

          似乎是个很低级的错误,但是的确困扰了我一段时间。

    void myCopyDirectory(CString source, CString target)  
    {  
        CreateDirectory(target,NULL); //创建目标文件夹  
        //AfxMessageBox("创建文件夹"+target);  
        CFileFind finder;  
        CString path;  
            path.Format("%s/*.*",source);  
        AfxMessageBox(path);  
        bool bWorking = finder.FindFile(path);  
        while(bWorking){  
            bWorking = finder.FindNextFile();  
            AfxMessageBox(finder.GetFileName());  
            if(finder.IsDirectory() && !finder.IsDots()){ //是文件夹 而且 名称不含 . 或 ..  
                myCopyDirectory(finder.GetFilePath(),target+"/"+finder.GetFileName()); //递归创建文件夹+"/"+finder.GetFileName()  
            }  
            else{ //是文件 则直接复制  
                //AfxMessageBox("复制文件"+finder.GetFilePath());//+finder.GetFileName()  
                CopyFile(finder.GetFilePath(),target+"/"+finder.GetFileName(),FALSE);  
            }  
        }  
    }  

    摘自 http://blog.csdn.net/jarvischu/article/details/5784875

  • 相关阅读:
    简单实现缓存需求
    Visual Studio 项目模板、文件模板、代码段和环境设置
    Memcached 基础应用
    Visual Studio 2010 模型设计工具 基本应用
    委托和事件 委托
    C# 编码规范
    锂电池正确使用方法
    HTC W800(XV6750) USB 连接 Windows 7 设备错误 解决办法
    UML 面向对象分析与设计
    注册表项写入与删除简便方法
  • 原文地址:https://www.cnblogs.com/wangfx91/p/4624513.html
Copyright © 2020-2023  润新知