Cara Menyalin File Tanpa Menggunakan Cache File Windows

Ketika berbicara tentang manajemen file di dalam Windows, Anda mungkin akan menghadapi situasi di mana caching file sistem operasi dapat menghambat kinerja—terutama saat berurusan dengan file besar. Misalnya, menyalin file besar dari drive USB atau server ke mesin lokal Anda bisa menjadi masalah karena Windows menyimpan file di cache, yang dapat menyebabkan perpindahan data dan meningkatkan waktu yang diperlukan untuk menyelesaikan operasi tersebut.

Di pos blog ini, kita akan mengeksplorasi bagaimana cara mengatasi masalah ini dengan menyalin file tanpa memanfaatkan cache sistem file Windows, khususnya menggunakan C#.

Memahami Cache Sistem File Windows

Sebelum terjun ke dalam solusi kode, penting untuk memahami apa itu cache sistem file. Windows menggunakan cache untuk mempercepat operasi file, yang biasanya melibatkan:

  • Menyimpan data file di memori untuk akses yang lebih cepat.
  • Berusaha memindahkan data dari perangkat yang lebih lambat seperti drive USB ke memori sistem yang lebih cepat.

Namun, dengan file yang lebih besar (anggaplah 2 GiB atau lebih), proses caching ini dapat menyebabkan ketidakefisienan, karena sistem berusaha mengelola memori yang tersedia.

Solusi: Menggunakan Panggilan API Win32

Untuk melewati perilaku caching ini, Windows menyediakan flag tertentu yang dapat Anda gunakan saat bekerja dengan operasi file. Flag ini adalah:

  • FILE_FLAG_WRITE_THROUGH: Flag ini memastikan bahwa penulisan ke file langsung ditulis ke perangkat penyimpanan dan tidak disimpan dalam memori.
  • FILE_FLAG_NO_BUFFERING: Flag ini menonaktifkan cache sistem untuk file, yang berarti semua operasi baca dan tulis terjadi langsung pada disk tanpa disimpan dalam cache.

Anda dapat memanfaatkan flag ini dalam kode C# Anda untuk mencapai penyalinan file secara langsung tanpa menggunakan cache.

Implementasi Langkah-demi-Langkah dalam C#

Berikut adalah cara menerapkan solusi ini dalam C#:

  1. Tambahkan Pustaka yang Diperlukan: Pastikan Anda menyertakan namespace yang diperlukan untuk operasi file dan layanan interop.

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    
  2. Deklarasikan Metode Native: Anda perlu mendeklarasikan fungsi API Win32 yang diperlukan.

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern IntPtr CreateFile(
        string lpFileName,
        uint dwDesiredAccess,
        uint dwShareMode,
        IntPtr lpSecurityAttributes,
        uint dwCreationDisposition,
        uint dwFlagsAndAttributes,
        IntPtr hTemplateFile);
    
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool ReadFile(
        IntPtr hFile,
        byte[] lpBuffer,
        uint nNumberOfBytesToRead,
        out uint lpNumberOfBytesRead,
        IntPtr lpOverlapped);
    
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool WriteFile(
        IntPtr hFile,
        byte[] lpBuffer,
        uint nNumberOfBytesToWrite,
        out uint lpNumberOfBytesWritten,
        IntPtr lpOverlapped);
    
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool CloseHandle(IntPtr hObject);
    
  3. Menggunakan Flag: Dalam fungsi menyalin file Anda, gunakan flag untuk membuat handle file.

    public void CopyFileWithoutCache(string sourceFilePath, string destFilePath)
    {
        const uint GENERIC_READ = 0x80000000;
        const uint GENERIC_WRITE = 0x40000000;
        const uint OPEN_EXISTING = 3;
        const uint FILE_FLAG_WRITE_THROUGH = 0x80000000;
        const uint FILE_FLAG_NO_BUFFERING = 0x20000000;
    
        IntPtr sourceHandle = CreateFile(sourceFilePath, GENERIC_READ, 0, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING, IntPtr.Zero);
        IntPtr destHandle = CreateFile(destFilePath, GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING, IntPtr.Zero);
    
        // Terapkan logika baca dan tulis file di sini...
    
        CloseHandle(sourceHandle);
        CloseHandle(destHandle);
    }
    

Kesimpulan

Dengan langkah-langkah yang dijelaskan di atas, Anda dapat menyalin file besar dengan efisien tanpa gangguan dari cache sistem file Windows. Metode ini sangat bermanfaat saat menangani file dengan kapasitas tinggi yang ditransfer dari perangkat lambat seperti drive USB.

Untuk detail lebih lanjut, lihat dokumentasi Microsoft tentang FILE_FLAG_WRITE_THROUGH dan FILE_FLAG_NO_BUFFERING.

Dengan memahami dan memanfaatkan flag ini, Anda dapat meningkatkan kinerja operasi file Anda secara signifikan. Selamat coding!