Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Copy file vào thư mục trong C#

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=true cho 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

ExceptionNguyên nhânXử lý
IOExceptionFile đích tồn tại, overwrite=falseSet overwrite=true hoặc xóa trước
UnauthorizedAccessExceptionKhông có quyền đọc/ghiRun as admin, check ACL
PathTooLongExceptionĐường dẫn > 260 charsEnable long paths Windows 10+ hoặc dùng \\?\ prefix
FileNotFoundExceptionFile nguồn bị xóa giữa chừngTry/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).