C# 删除文件夹内所有文件 完整指南
你需要在 C# 中实现删除指定文件夹内所有文件的功能,下面会提供多种适配不同场景的实现方案,包含基础用法、安全用法及进阶需求,同时规避常见坑点。
一、 基础方案:删除文件夹内所有文件(保留子文件夹)
适用于仅删除目标文件夹下直接存放的文件 ,不删除子文件夹及其内部文件的场景,核心使用 System.IO 命名空间的 API。
核心 API 说明
Directory.GetFiles(string path):获取指定文件夹下所有直接文件的完整路径(返回string[]数组)。File.Delete(string filePath):删除单个指定文件,需处理文件占用等异常。
实现代码
csharp
运行
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仅搜索当前目录,对应基础方案)。
实现代码
csharp
运行
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 说明
Directory.Delete(string path, bool recursive):recursive: true:递归删除目标文件夹及其所有子文件夹、文件。recursive: false:仅删除空的目标文件夹。
Directory.CreateDirectory(string path):创建文件夹(若文件夹已存在,不会抛出异常,直接返回现有文件夹信息)。
实现代码
csharp
运行
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);
}
}
}
四、 关键注意事项(避坑指南)
- 路径格式 :
- C# 中文件夹路径推荐使用
@Verbatim 字符串(如@"D:\TestFolder"),避免转义字符(\)冲突。 - 支持相对路径(如
@"TestFolder")和绝对路径(如@"D:\TestFolder"),相对路径对应程序运行目录。
- C# 中文件夹路径推荐使用
- 异常处理 :
- 必须捕获
UnauthorizedAccessException(权限不足)和IOException(文件 / 文件夹被占用、只读文件等)。 - 避免因单个文件删除失败导致整个批量操作中断(可在循环内添加
try-catch单独处理单个文件)。
- 必须捕获
- 只读文件处理 :
- 若文件为「只读属性」,直接调用
File.Delete会抛出异常,需先通过File.SetAttributes(filePath, FileAttributes.Normal)重置文件属性。
- 若文件为「只读属性」,直接调用
- 并发安全 :
- 若存在多线程 / 多进程操作同一文件夹,需先通过
File.Exists(filePath)验证文件是否存在,避免删除已被其他进程删除的文件。
- 若存在多线程 / 多进程操作同一文件夹,需先通过
- 谨慎操作 :
- 删除操作不可逆,建议在正式删除前添加日志输出或备份逻辑,避免误删重要文件。
- 切勿操作系统关键文件夹(如
C:\Windows),可能导致系统异常。
总结
- 仅删当前文件夹文件(保留子文件夹) :使用
Directory.GetFiles(folderPath)+ 遍历File.Delete。 - 删所有文件(含子文件夹文件,保留文件夹结构) :使用
Directory.GetFiles(..., SearchOption.AllDirectories)+ 递归删除。 - 彻底清空文件夹(重建空文件夹) :使用
Directory.Delete(folderPath, true)+Directory.CreateDirectory(folderPath),效率最高。 - 安全要点:添加异常处理、验证路径存在、处理只读文件、避免误删系统文件。