C#删除文件夹里的所有文件的实现方案

 更新时间:2025年12月29日 08:48:24   作者:StevenChen85  
你需要在 C# 中实现删除指定文件夹内所有文件的功能,下面会提供多种适配不同场景的实现方案,包含基础用法、安全用法及进阶需求,同时规避常见坑点,需要的朋友可以参考下

一、 基础方案:删除文件夹内所有文件(保留子文件夹)

适用于仅删除目标文件夹下直接存放的文件,不删除子文件夹及其内部文件的场景,核心使用 System.IO 命名空间的 API。

核心 API 说明

  1. Directory.GetFiles(string path):获取指定文件夹下所有直接文件的完整路径(返回 string[] 数组)。
  2. File.Delete(string filePath):删除单个指定文件,需处理文件占用等异常。

实现代码

using System;
using System.IO;
 
namespace DeleteFolderFiles
{
    class BasicDelete
    {
        /// <summary>
        /// 删除指定文件夹内所有直接文件(保留子文件夹)
        /// </summary>
        /// <param name="folderPath">目标文件夹路径</param>
        public static void DeleteAllFilesInFolder(string folderPath)
        {
            // 1. 验证文件夹是否存在,避免路径错误
            if (!Directory.Exists(folderPath))
            {
                Console.WriteLine($"错误:文件夹 {folderPath} 不存在!");
                return;
            }
 
            try
            {
                // 2. 获取文件夹内所有直接文件的路径
                string[] allFiles = Directory.GetFiles(folderPath);
 
                // 3. 遍历并删除每个文件
                foreach (string filePath in allFiles)
                {
                    // 确保文件存在(避免并发场景下文件已被删除)
                    if (File.Exists(filePath))
                    {
                        File.Delete(filePath);
                        Console.WriteLine($"成功删除文件:{filePath}");
                    }
                }
 
                Console.WriteLine("所有文件删除完成!");
            }
            catch (UnauthorizedAccessException ex)
            {
                Console.WriteLine($"错误:没有权限删除文件 - {ex.Message}");
            }
            catch (IOException ex)
            {
                Console.WriteLine($"错误:文件被占用或无法删除 - {ex.Message}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"未知错误:{ex.Message}");
            }
        }
 
        // 调用示例
        static void Main(string[] args)
        {
            // 目标文件夹路径(可改为绝对路径,如 @"D:\TestFolder")
            string targetFolder = @"TestFolder";
            DeleteAllFilesInFolder(targetFolder);
        }
    }
}

二、 进阶方案 1:删除文件夹内所有文件(包含子文件夹文件)

适用于需要递归删除目标文件夹下所有文件(含子文件夹内文件),仅保留文件夹结构(不删除任何文件夹)的场景。

核心 API 说明

Directory.GetFiles(string path, string searchPattern, SearchOption searchOption)

  • searchPattern:文件筛选模式,"*.*" 匹配所有文件。
  • SearchOption.AllDirectories:递归搜索所有子目录(TopDirectoryOnly 仅搜索当前目录,对应基础方案)。

实现代码

using System;
using System.IO;
 
namespace DeleteFolderFiles
{
    class RecursiveDeleteFiles
    {
        /// <summary>
        /// 递归删除文件夹内所有文件(包含子文件夹文件,保留文件夹结构)
        /// </summary>
        /// <param name="folderPath">目标文件夹路径</param>
        public static void DeleteAllFilesRecursively(string folderPath)
        {
            if (!Directory.Exists(folderPath))
            {
                Console.WriteLine($"错误:文件夹 {folderPath} 不存在!");
                return;
            }
 
            try
            {
                // 递归获取所有文件(当前目录+所有子目录)
                string[] allFiles = Directory.GetFiles(
                    folderPath, 
                    "*.*", 
                    SearchOption.AllDirectories
                );
 
                // 批量删除
                foreach (string filePath in allFiles)
                {
                    if (File.Exists(filePath))
                    {
                        // 可选:设置文件为正常属性(避免只读文件无法删除)
                        File.SetAttributes(filePath, FileAttributes.Normal);
                        File.Delete(filePath);
                        Console.WriteLine($"成功删除文件:{filePath}");
                    }
                }
 
                Console.WriteLine("所有文件(含子文件夹文件)删除完成!");
            }
            catch (UnauthorizedAccessException ex)
            {
                Console.WriteLine($"权限错误:{ex.Message}");
            }
            catch (IOException ex)
            {
                Console.WriteLine($"文件占用错误:{ex.Message}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"未知错误:{ex.Message}");
            }
        }
 
        // 调用示例
        static void Main(string[] args)
        {
            string targetFolder = @"D:\TestFolder";
            DeleteAllFilesRecursively(targetFolder);
        }
    }
}

三、 进阶方案 2:删除文件夹(含所有文件 + 子文件夹)+ 重建空文件夹

适用于需要彻底清空文件夹(删除所有文件和子文件夹),最终保留一个空的目标文件夹的场景,比递归删除文件更高效。

核心 API 说明

  1. Directory.Delete(string path, bool recursive)
    • recursive: true:递归删除目标文件夹及其所有子文件夹、文件。
    • recursive: false:仅删除空的目标文件夹。
  2. Directory.CreateDirectory(string path):创建文件夹(若文件夹已存在,不会抛出异常,直接返回现有文件夹信息)。

实现代码

using System;
using System.IO;
 
namespace DeleteFolderFiles
{
    class DeleteAndRecreateFolder
    {
        /// <summary>
        /// 彻底清空文件夹(删除文件+子文件夹),重建空文件夹
        /// </summary>
        /// <param name="folderPath">目标文件夹路径</param>
        public static void ClearFolderCompletely(string folderPath)
        {
            try
            {
                // 1. 若文件夹存在,递归删除(含所有文件和子文件夹)
                if (Directory.Exists(folderPath))
                {
                    Directory.Delete(folderPath, true);
                    Console.WriteLine($"已删除文件夹:{folderPath}");
                }
 
                // 2. 重建空文件夹
                Directory.CreateDirectory(folderPath);
                Console.WriteLine($"已重建空文件夹:{folderPath}");
            }
            catch (UnauthorizedAccessException ex)
            {
                Console.WriteLine($"权限错误:无法删除/创建文件夹 - {ex.Message}");
            }
            catch (IOException ex)
            {
                Console.WriteLine($"IO错误:文件夹被占用 - {ex.Message}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"未知错误:{ex.Message}");
            }
        }
 
        // 调用示例
        static void Main(string[] args)
        {
            string targetFolder = @"D:\TestFolder";
            ClearFolderCompletely(targetFolder);
        }
    }
}

四、 关键注意事项(避坑指南)

  1. 路径格式
    • C# 中文件夹路径推荐使用 @ Verbatim 字符串(如 @"D:\TestFolder"),避免转义字符(\)冲突。
    • 支持相对路径(如 @"TestFolder")和绝对路径(如 @"D:\TestFolder"),相对路径对应程序运行目录。
  2. 异常处理
    • 必须捕获 UnauthorizedAccessException(权限不足)和 IOException(文件 / 文件夹被占用、只读文件等)。
    • 避免因单个文件删除失败导致整个批量操作中断(可在循环内添加 try-catch 单独处理单个文件)。
  3. 只读文件处理
    • 若文件为「只读属性」,直接调用 File.Delete 会抛出异常,需先通过 File.SetAttributes(filePath, FileAttributes.Normal) 重置文件属性。
  4. 并发安全
    • 若存在多线程 / 多进程操作同一文件夹,需先通过 File.Exists(filePath) 验证文件是否存在,避免删除已被其他进程删除的文件。
  5. 谨慎操作
    • 删除操作不可逆,建议在正式删除前添加日志输出或备份逻辑,避免误删重要文件。
    • 切勿操作系统关键文件夹(如 C:\Windows),可能导致系统异常。

总结

  1. 仅删当前文件夹文件(保留子文件夹):使用 Directory.GetFiles(folderPath) + 遍历 File.Delete
  2. 删所有文件(含子文件夹文件,保留文件夹结构):使用 Directory.GetFiles(..., SearchOption.AllDirectories) + 递归删除。
  3. 彻底清空文件夹(重建空文件夹):使用 Directory.Delete(folderPath, true) + Directory.CreateDirectory(folderPath),效率最高。
  4. 安全要点:添加异常处理、验证路径存在、处理只读文件、避免误删系统文件。

到此这篇关于C#删除文件夹里的所有文件的实现方案的文章就介绍到这了,更多相关C#删除文件夹所有文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#编程实现四舍五入、向上及下取整的方法

    C#编程实现四舍五入、向上及下取整的方法

    这篇文章主要介绍了C#编程实现四舍五入、向上及下取整的方法,涉及C#数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • .NET中的静态与非静态的区别分析

    .NET中的静态与非静态的区别分析

    .NET中的静态与非静态的区别分析,需要的朋友可以参考一下
    2013-03-03
  • 一篇文章教会你用Unity制作网格地图生成组件

    一篇文章教会你用Unity制作网格地图生成组件

    网格地图这个功能在策略型游戏中应用比较广泛,基本情况下会将地图分割成正方形网格或者六边形网格,这篇文章主要给大家介绍了如何通过一篇文章学会用Unity制作网格地图生成组件的相关资料,需要的朋友可以参考下
    2021-08-08
  • C#实现SMTP邮件附件发送功能详解

    C#实现SMTP邮件附件发送功能详解

    这篇文章主要为大家详细介绍了如何利用C#实现SMTP邮件附件发送的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C#窗体布局方式详解

    C#窗体布局方式详解

    这篇文章主要介绍了C#窗体布局方式详解的相关资料,需要的朋友可以参考下
    2016-09-09
  • C#加密解密文件小工具实现代码

    C#加密解密文件小工具实现代码

    一个文件夹加密小工具,该工具是操作文件夹名称的方法实现文件夹的一般加密,文件夹中的文件(视频、图片等)都原封不动的保存在那里
    2012-05-05
  • C#实现简单打字小游戏

    C#实现简单打字小游戏

    这篇文章主要为大家详细介绍了C#实现简单打字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • c#中的浮点型转整形的舍取 四舍五入和银行家舍入实现代码

    c#中的浮点型转整形的舍取 四舍五入和银行家舍入实现代码

    c#中的浮点型转整形的舍取 四舍五入和银行家舍入实现代码,学习c#的朋友可以参考下
    2012-03-03
  • C# websocket及时通信协议的实现方法示例

    C# websocket及时通信协议的实现方法示例

    说到websocket大家一定不会陌生,WebSocket是HTML5一种新的协议。下面这篇文章主要给大家介绍了关于C# websocket及时通信协议的实现方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-11-11
  • C#中的委托delegate用法的示例详解

    C#中的委托delegate用法的示例详解

    这篇文章主要介绍了C#中的委托用法的示例详解。本章将由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.NET Framework 中的委托和事件、委托中方法异常和超时的处理、委托与异步编程、委托和事件对Observer 设计模式的意义。感兴趣的可以了解一下
    2020-07-07

最新评论