复制需求:
1.指定后缀,只会复制有后缀的文件,可输入多个后缀。
2.指定文件夹,只会复制指定名称的文件夹,可输入多个文件夹。
代码如下
public static class FileUtils
{
/// <summary>
/// 复制文件夹
/// </summary>
/// <param name="sourceFolder">源文件夹路径</param>
/// <param name="destinationFolder">目标文件夹路径</param>
/// <param name="includeFiles">包含的文件后缀名列表,如 ".txt", ".jpg" 等</param>
/// <param name="includeFolders">包含的文件夹名称列表</param>
public static void CopyFolderEx(string sourceFolder, string destinationFolder, List<string> includeFiles = null, List<string> includeFolders = null)
{
if (!Directory.Exists(sourceFolder))
{
throw new DirectoryNotFoundException($"源文件夹不存在: {sourceFolder}");
}
if (!Directory.Exists(destinationFolder))
{
Directory.CreateDirectory(destinationFolder);
}
// 如果指定了特定文件后缀名,则只复制这些后缀名的文件
if (includeFiles != null && includeFiles.Count > 0)
{
foreach (string file in Directory.GetFiles(sourceFolder, "*.*", SearchOption.AllDirectories))
{
string fileExtension = Path.GetExtension(file);
// 检查文件后缀名是否在指定的后缀名列表中
if (includeFiles.Contains(fileExtension, StringComparer.OrdinalIgnoreCase))
{
string relativePath = file.Substring(sourceFolder.Length + 1);
string destinationFilePath = Path.Combine(destinationFolder, relativePath);
// 确保目标文件夹存在
string destinationFileDirectory = Path.GetDirectoryName(destinationFilePath);
if (!Directory.Exists(destinationFileDirectory))
{
Directory.CreateDirectory(destinationFileDirectory);
}
// 复制文件
File.Copy(file, destinationFilePath, true);
}
}
}
// 如果指定了特定文件夹,则只复制这些文件夹
if (includeFolders != null && includeFolders.Count > 0)
{
foreach (string subDir in Directory.GetDirectories(sourceFolder, "*", SearchOption.AllDirectories))
{
string relativePath = subDir.Substring(sourceFolder.Length + 1);
string folderName = Path.GetFileName(subDir);
// 检查文件夹是否在指定的文件夹列表中
if (includeFolders.Contains(folderName, StringComparer.OrdinalIgnoreCase))
{
string destinationSubDirPath = Path.Combine(destinationFolder, relativePath);
// 递归复制文件夹及其内容
CopyFolder(subDir, destinationSubDirPath);
}
}
}
}
/// <summary>
/// 递归复制文件夹及其内容
/// </summary>
/// <param name="sourceDir">源文件夹路径</param>
/// <param name="destinationDir">目标文件夹路径</param>
private static void CopyFolder(string sourceDir, string destinationDir)
{
if (!Directory.Exists(destinationDir))
{
Directory.CreateDirectory(destinationDir);
}
// 复制文件
foreach (string file in Directory.GetFiles(sourceDir))
{
string destinationFilePath = Path.Combine(destinationDir, Path.GetFileName(file));
File.Copy(file, destinationFilePath, true);
}
// 递归复制子文件夹
foreach (string subDir in Directory.GetDirectories(sourceDir))
{
string destinationSubDir = Path.Combine(destinationDir, Path.GetFileName(subDir));
CopyFolder(subDir, destinationSubDir);
}
}
}