ใช้คลาส System.IO.File เมธอด Copy และ Directory.GetFiles เพื่อหาไฟล์ต้นทาง
File.Copy Overloads
| Signature | พฤติกรรม |
|---|---|
Copy(source, dest) |
Copy ไฟล์ หากไฟล์ปลายทางมีอยู่ → โยน IOException |
Copy(source, dest, overwrite) |
overwrite=true: ทับไฟล์เก่า, false: เหมือน Overload แรก |
ตัวอย่าง: Copy ทุกไฟล์จากโฟลเดอร์หนึ่งไปอีกโฟลเดอร์
using System;
using System.IO;
static void Main()
{
string sourceDir = @"C:\SourceFolder";
string destDir = @"C:\DestFolder";
// สร้างโฟลเดอร์ปลายทางหากยังไม่มี
Directory.CreateDirectory(destDir);
// ดึงไฟล์ทั้งหมดใน Source (Top Directory Only)
string[] files = Directory.GetFiles(sourceDir, "*.*", SearchOption.TopDirectoryOnly);
Console.WriteLine($"Found {files.Length} files to copy.");
foreach (string sourceFile in files)
{
string fileName = Path.GetFileName(sourceFile);
string destFile = Path.Combine(destDir, fileName);
try
{
// overwrite = true เพื่อทับไฟล์ซ้ำ
File.Copy(sourceFile, destFile, overwrite: true);
Console.WriteLine($"Copied: {fileName}");
}
catch (Exception ex)
{
Console.WriteLine($"Failed to copy {fileName}: {ex.Message}");
}
}
// แสดงไฟล์ใน Dest หลัง Copy
Console.WriteLine("\nDestination folder contents:");
foreach (string f in Directory.GetFiles(destDir))
Console.WriteLine(Path.GetFileName(f));
}
ผลลัพธ์ตัวอย่าง
Found 3 files to copy.
Copied: data.txt
Copied: image.png
Copied: report.pdf
Destination folder contents:
data.txt
image.png
report.pdf
ตัวอย่างขั้นสูง: Copy พร้อม Progress และ Filter
public static void CopyFilesWithProgress(
string sourceDir,
string destDir,
string searchPattern = "*.*",
SearchOption option = SearchOption.TopDirectoryOnly,
Action progressCallback = null)
{
Directory.CreateDirectory(destDir);
var files = Directory.EnumerateFiles(sourceDir, searchPattern, option);
foreach (var sourceFile in files)
{
var fileName = Path.GetFileName(sourceFile);
var destFile = Path.Combine(destDir, fileName);
var fileSize = new FileInfo(sourceFile).Length;
// Copy with overwrite
File.Copy(sourceFile, destFile, true);
progressCallback?.Invoke(fileName, fileSize, fileSize); // Simulate progress
}
}
// ใช้งาน
CopyFilesWithProgress(
@"C:\Source",
@"C:\Dest",
"*.pdf", // แค่ PDF
SearchOption.AllDirectories, // รวม Subfolders
(name, copied, total) => Console.WriteLine($"{name}: {copied}/{total} bytes"));
ข้อควรระวัง
- Permissions: ต้องมี Read Source, Write Dest
- Long Paths: Path > 260 Chars → ใช้
\\?\Prefix หรือ Enable Long Paths ใน OS - Atomicity: File.Copy ไม่ Atomic หาก Crash ระหว่างทางไฟล์ Dest อาจ Corrupt
- Large Files: ใช้
FileStream+ Buffer +CopyToAsyncสำหรับ Control Memory/Progress - Cross-device: Copy ข้าม Drive/Network Share ช้ากว่า
Async Version (.NET Core 3.0+)
public static async Task CopyFileAsync(string source, string dest, bool overwrite = true)
{
using var sourceStream = File.OpenRead(source);
using var destStream = File.Create(dest); // overwrite โดยค่าเริ่มต้น
// หรือใช้ FileMode.CreateNew สำหรับไม่ทับ
await sourceStream.CopyToAsync(destStream);
}