递归删除文件(支持通配符)

一直想做一个类似 Windows 命令行中 del 命令删除文件的功能,它支持 环境变量通配符可以递归,后来发现自己写这么一个小功能还真的不是一件容易的事情,没办法为了着急使用先临时做了一个小版本。代码有些缺憾。

  • 不支持环境变量
  • 不支持固定后缀文件递归删除
// example.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <iostream>


BOOL DeleteFiles(const std::wstring file_full_path)
{
    BOOL no_error = TRUE;
    WIN32_FIND_DATA win32_find_data = { 0 };

    std::wstring dir = file_full_path.substr(0, file_full_path.rfind(_T("\\"))).c_str();
    std::wstring file = file_full_path.substr(file_full_path.rfind(_T("\\")) + 1, file_full_path.length());

    if (dir.size() == 0 || file.size() == 0)
    {
        return FALSE;
    }

    HANDLE handle = FindFirstFile(file_full_path.c_str(), &win32_find_data);
    if (INVALID_HANDLE_VALUE == handle)
    {
        return no_error;
    }

    do
    {
        // 如果是目录递归操作
        if (win32_find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            // 排除 . 和 .. 两个文件夹
            if (_tcsicmp(_T("."), win32_find_data.cFileName) != 0 &&
                _tcsicmp(_T(".."), win32_find_data.cFileName) != 0)
            {
                // 根目录加上搜索出来的目录
                std::wstring new_full_path = dir;
                new_full_path += _T("\\");
                new_full_path += win32_find_data.cFileName;

                // 备份搜索出来的目录完整路径用以删除
                std::wstring new_dir = new_full_path;

                // 再加上要删除的文件名
                new_full_path += _T("\\");
                new_full_path += file;

                // 开始删除
                if (DeleteFiles(new_full_path))
                {
                    // 删除子文件后删除整个目录
                    RemoveDirectory(new_dir.c_str());
                }
            }
        }
        else
        {
            std::wstring full_file_name = dir;
            full_file_name += _T("\\");
            full_file_name += win32_find_data.cFileName;

            // 去除只读文件的只读属性
            DWORD file_attr = GetFileAttributes(full_file_name.c_str());
            if ((file_attr & FILE_ATTRIBUTE_READONLY) != 0)
            {
                SetFileAttributes(full_file_name.c_str(), file_attr & (~FILE_ATTRIBUTE_READONLY));
            }

            BOOL del_res = DeleteFiles(full_file_name.c_str());
            if (del_res)
            {
                std::wcout << full_file_name.c_str() << std::endl;
            }

            // 如果有一个文件删除失败则返回上层,上层若发现有删除失败的文件则不删除其斧文件夹
            if (del_res == FALSE && no_error == TRUE)
            {
                no_error = FALSE;
            }
        }
    } while (FindNextFile(handle, &win32_find_data) != 0);

    FindClose(handle);
    return no_error;
}

int _tmain(int argc, _TCHAR* argv[])
{
    _wsetlocale(LC_ALL, L"chs");

    DeleteFiles(_T(R"(C:\Users\ADMINI~1\AppData\Local\Temp\*)"));

    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互联网技术栈

Elasticsearch之元数据(meta-fields)介绍

在Elasticsearch下,一个文档除了有数据之外,它还包含了元数据(Metadata)。每创建一条数据时,都会对元数据进行写入等操作,当然有些元数据是在创...

1036
来自专栏张善友的专栏

Ibatis in action 电子书

电子书 ? 是ibatis 项目组写的ibatis开发的权威书籍.现在只有电子版,目前使用Java作为描述的平台,这个书对于.NET和Ruby一样适用.    ...

2037
来自专栏数据和云

【循序渐进Oracle】Oracle的逻辑备份与恢复

编辑手记:针对最近发生的炉石及GitLab事件,我们不得不再次强调备份的重要性。DBA的四大守则,第一条就是备份重于一切。年初做好备份,愿你的系统17无恙。 本...

3908
来自专栏沃趣科技

ASM 翻译系列第十五弹:ASM Internal ASM File Directory

原作者:Bane Radulovic 译者: 郭旭瑞 审核: 魏兴华 DBGeeK社群联合出品 ASM File Directory 本篇主要介绍A...

3514
来自专栏Java学习网

10 个影响程序性能的Hibernate 错误,学会让你少走弯路

我在很多应用程序中修复过性能问题,其中大部分都是由同样的错误引起的。修复之后,性能变得更溜,而且其中的大部分问题都很简单。所以,如果你想改进应用程序,那么可能也...

2315
来自专栏码农分享

代理模式(Proxy)

转载 https://blog.csdn.net/lovelion/article/details/8228042

1022
来自专栏张戈的专栏

常用MySQL语句搜集整理

折腾 WordPress 多少要接触到 MySQL 的一些操作,比如,玛思阁之前重装 postview 插件后发现所有的 view 数据都被清空了!只好到 ph...

3825
来自专栏技术翻译

关于Couchbase-Dzone数据库,你必须了解的10件事情

此功能已经存在了一段时间,但仍值得一提。一些Key-Value Store只允许你将整个文档全部整合在一起,这是一个合理的。但是,如果你使用Couchbase作...

1820
来自专栏祝威廉

ElasticSearch QueryCache漫谈

这些天在做ES调优,因为之前更多的是考虑ES的架构和可运维性,并没有过多关注query调优这块。今天一查Query Cache相关的内容,发现是少之又少。于是自...

1412
来自专栏学习有记

T-SQL进阶:超越基础 Level 9:动态T-SQL代码

1362

扫码关注云+社区