Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธี Copy ไฟล์ไปยัง Directory ใน C#

ใช้คลาส 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);
}