Sử dụng System.IO.File.Copy để copy file. Có 2 overload:
Copy(source, dest): Không ghi đè nếu file đích đã tồn tại (ném IOException).Copy(source, dest, overwrite):overwrite=truecho phép ghi đè.
Ví dụ: Copy tất cả file từ thư mục nguồn sang đích
using System;
using System.IO;
class Program
{
static void Main()
{
string sourceDir = @"C:\SourceFolder";
string destDir = @"C:\DestFolder";
// Tạo thư mục đích nếu chưa có
Directory.CreateDirectory(destDir);
// Lấy tất cả file trong source (chỉ cấp 1)
string[] files = Directory.GetFiles(sourceDir, "*.*", SearchOption.TopDirectoryOnly);
foreach (string file in files)
{
string fileName = Path.GetFileName(file);
string destFile = Path.Combine(destDir, fileName);
// Copy với ghi đè
File.Copy(file, destFile, overwrite: true);
Console.WriteLine($"Copied: {fileName}");
}
Console.WriteLine("Done.");
Console.ReadLine();
}
}
Copy đệ quy (bao gồm thư mục con)
static void CopyDirectory(string sourceDir, string destDir, bool overwrite = true)
{
Directory.CreateDirectory(destDir);
// Copy files
foreach (string file in Directory.GetFiles(sourceDir))
{
string destFile = Path.Combine(destDir, Path.GetFileName(file));
File.Copy(file, destFile, overwrite);
}
// Recurse subdirectories
foreach (string dir in Directory.GetDirectories(sourceDir))
{
string destSubDir = Path.Combine(destDir, Path.GetFileName(dir));
CopyDirectory(dir, destSubDir, overwrite);
}
}
Ví dụ dùng FileInfo (có thêm metadata)
foreach (string file in Directory.GetFiles(sourceDir))
{
FileInfo fi = new FileInfo(file);
string destFile = Path.Combine(destDir, fi.Name);
fi.CopyTo(destFile, overwrite: true); // FileInfo.CopyTo
Console.WriteLine($"{fi.Name} ({FormatSize(fi.Length)}) copied.");
}
static string FormatSize(long bytes) =>
bytes < 1024 ? $"{bytes} B" :
bytes < 1024*1024 ? $"{bytes/1024.0:0.#} KB" :
$"{bytes/1024.0/1024:0.#} MB";
Xử lý lỗi thường gặp
| Exception | Nguyên nhân | Xử lý |
|---|---|---|
| IOException | File đích tồn tại, overwrite=false | Set overwrite=true hoặc xóa trước |
| UnauthorizedAccessException | Không có quyền đọc/ghi | Run as admin, check ACL |
| PathTooLongException | Đường dẫn > 260 chars | Enable long paths Windows 10+ hoặc dùng \\?\ prefix |
| FileNotFoundException | File nguồn bị xóa giữa chừng | Try/catch, kiểm tra File.Exists |
Async Copy (.NET Core 3.0+)
async Task CopyFileAsync(string source, string dest, bool overwrite = true)
{
using var src = File.OpenRead(source);
using var dst = File.Create(dest); // overwrite tự động
await src.CopyToAsync(dst);
}
// Hoặc dùng FileStream với buffer
await using var src = new FileStream(source, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true);
await using var dst = new FileStream(dest, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true);
await src.CopyToAsync(dst);
Lưu ý: File.Copy là blocking I/O. Với file lớn hoặc nhiều file, hãy dùng async hoặc Parallel.ForEach (cẩn thận I/O contention).