一、前言
这个系列是本人的一个学习笔记。
本代码主要实现将一个文件夹下(包含子文件夹下)的所有指定类型的文件复制到一个新的文件夹下。
下面是实现的源代码,可直接复制使用。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TEST
{
internal class Program
{
static void Main(string[] args)
{
string path = @"C:\Users\Administrator\Desktop\test";//源路径
string path1 = @"C:\Users\Administrator\Desktop\testB";//目标路径
var file = GetAllFiles(path, ".docx");//获得该文件夹下类型为“.docx”所有文件
bool b = IsOrNo(".docx", file.ToArray());//判断是否包含该类型文件 true--包含
int a = 0;//统计文件数量
if (b)
{
foreach (var item in file)
{
a++;
int index0 = item.IndexOf(@"\"); // 第一个【"\"】的位置
int index1 = item.LastIndexOf(@"\"); // 最后一个【"\"】的位置
int index2 = item.LastIndexOf(@".docx"); // 最后一个【".docx"】的位置
string name = item.Substring(index1 + 1, index2 - index1 - 1); //获得文件名
File.Copy(item, path1 + @"\" + name + ".docx", true); //复制文件
Console.WriteLine(item.ToString()); //显示已复制的文件
}
Console.WriteLine($"共有{a}个文件!"); //显示文件个数
}
else
{
Console.WriteLine("该文件夹下没有该类型文件!");
}
Console.ReadKey();
}
/// <summary>
/// 判断是否包含该类型文件 true--包含
/// </summary>
/// <param name="strings">文件路径</param>
/// <param name="key">所要包含的类型,例如“.docx”</param>
/// <returns></returns>
public static bool IsOrNo(string key, params string[] strings)
{
int c = 0;
foreach (var item in strings)
{
string s = item.ToString();
if (s.Contains(key))
{
c++;
break;
}
}
if (c > 0)
{
return true;
}
else
{
return false;
}
}
public static List<string> GetAllFiles(string folder_path, string key_word = "no match")
{
List<string> filePaths = new List<string>();
// 获取当前文件夹下的所有文件
string[] files = Directory.GetFiles(folder_path);
// 判断是否包含关键字
if (key_word == "no match")
{
filePaths.AddRange(files);
}
else
{
foreach (string file in files)
{
// 检查文件名是否包含指定扩展名
if (Path.GetExtension(file).Equals(key_word, StringComparison.OrdinalIgnoreCase))
{
filePaths.Add(file);
}
}
}
// 获取当前文件夹下的所有子文件夹
string[] subDirectories = Directory.GetDirectories(folder_path);
// 递归遍历子文件夹下的文件
foreach (string subDirectory in subDirectories)
{
filePaths.AddRange(GetAllFiles(subDirectory, key_word));
}
return filePaths;
}
// 复制文件夹下的所有文件到新的位置
public static void CopyAllFiles(string sourceDir, string destDir)
{
//目标目录不存在则创建
if (!Directory.Exists(destDir))
{
Directory.CreateDirectory(destDir);
}
DirectoryInfo sourceDireInfo = new DirectoryInfo(sourceDir);
List<FileInfo> fileList = new List<FileInfo>();
GetFileList(sourceDireInfo, fileList); // 获取源文件夹下的所有文件
List<DirectoryInfo> dirList = new List<DirectoryInfo>();
GetDirList(sourceDireInfo, dirList); // 获取源文件夹下的所有子文件夹
// 创建目标文件夹结构
foreach (DirectoryInfo dir in dirList)
{
string sourcePath = dir.FullName;
string destPath = sourcePath.Replace(sourceDir, destDir); // 替换源文件夹路径为目标文件夹路径
if (!Directory.Exists(destPath))
{
Directory.CreateDirectory(destPath); // 创建目标文件夹
}
}
// 复制文件到目标文件夹
foreach (FileInfo fileInfo in fileList)
{
string sourceFilePath = fileInfo.FullName;
string destFilePath = sourceFilePath.Replace(sourceDir, destDir); // 替换源文件夹路径为目标文件夹路径
File.Copy(sourceFilePath, destFilePath, true); // 复制文件,允许覆盖目标文件
}
}
// 递归获取文件列表
private static void GetFileList(DirectoryInfo dir, List<FileInfo> fileList)
{
fileList.AddRange(dir.GetFiles()); // 添加当前文件夹下的所有文件
foreach (DirectoryInfo directory in dir.GetDirectories())
{
GetFileList(directory, fileList); // 递归获取子文件夹下的文件
}
}
// 递归获取子文件夹列表
private static void GetDirList(DirectoryInfo dir, List<DirectoryInfo> dirList)
{
dirList.AddRange(dir.GetDirectories()); // 添加当前文件夹下的所有子文件夹
foreach (DirectoryInfo directory in dir.GetDirectories())
{
GetDirList(directory, dirList); // 递归获取子文件夹下的子文件夹
}
}
}
}
源文件夹下有3个子文件夹,提取含子文件夹在内的所有类型为Word的文件:
运行结果: