遍歷源文件夾所有圖片文件,複製到目標文件夾,保持文件名不變,支持子目錄遞歸。
using System;
using System.IO;
public class ImageCopier {
public void CopyImages(string sourceDir, string destDir, bool overwrite = true) {
// 1. 參數驗證
if (!Directory.Exists(sourceDir))
throw new DirectoryNotFoundException($"源目錄不存在: {sourceDir}");
// 2. 確保目標目錄存在
Directory.CreateDirectory(destDir);
// 3. 定義圖片擴展名過濾
string[] imageExtensions = { ".jpg", ".jpeg", ".png", ".bmp", ".gif", ".tiff", ".webp" };
// 4. 遞歸複製
CopyDirectoryRecursive(sourceDir, destDir, imageExtensions, overwrite);
}
private void CopyDirectoryRecursive(string src, string dest, string[] extensions, bool overwrite) {
try {
// 複製當前目錄文件
foreach (string file in Directory.GetFiles(src)) {
string ext = Path.GetExtension(file).ToLower();
if (Array.Exists(extensions, e => e == ext)) {
string destFile = Path.Combine(dest, Path.GetFileName(file));
if (overwrite || !File.Exists(destFile)) {
File.Copy(file, destFile, overwrite);
Console.WriteLine($"已複製: {file} → {destFile}");
}
}
}
// 遞歸處理子目錄
foreach (string dir in Directory.GetDirectories(src)) {
string subDest = Path.Combine(dest, Path.GetFileName(dir));
CopyDirectoryRecursive(dir, subDest, extensions, overwrite);
}
} catch (Exception ex) {
LogError(ex.Message);
}
}
private void LogError(string msg) {
File.AppendAllText("copy_log.txt", $"{DateTime.Now}: {msg}\n");
}
}
// 使用示例
var copier = new ImageCopier();
copier.CopyImages(@"D:\Photos", @"E:\Backup\Photos");
Directory.GetFiles() 獲取文件列表,配合擴展名過濾Path.Combine() 安全拼接路徑,跨平台兼容File.Copy(..., true) 覆蓋模式參數FileStream 分塊複製,顯示進度Parallel.ForEach 並行複製提升性能FileSystemWatcher 實時監控增量同步