كيفية نسخ ملف دون استخدام ذاكرة التخزين المؤقت لنظام ويندوز

عند إدارة الملفات في نظام ويندوز، قد تواجه حالات حيث تؤثر ذاكرة التخزين المؤقت لنظام الملفات على الأداء، خاصة عند التعامل مع الملفات الكبيرة. على سبيل المثال، قد يكون نسخ ملف كبير من محرك USB أو خادم إلى جهازك المحلي مشكلة نظرًا لأن ويندوز يقوم بتخزين الملف في ذاكرة التخزين المؤقت، مما قد يؤدي إلى استبدال البيانات وزيادة الوقت المستغرق لإكمال العملية.

في هذه التدوينة، سنستكشف كيفية معالجة هذه المشكلة عن طريق نسخ الملفات دون استخدام ذاكرة التخزين المؤقت لنظام الملفات في ويندوز، وبالتحديد باستخدام C#.

فهم ذاكرة التخزين المؤقت لنظام الملفات في ويندوز

قبل الغوص في حل الترميز، من المهم أن نفهم ما هي ذاكرة التخزين المؤقت لنظام الملفات. يستخدم ويندوز ذاكرة تخزين مؤقت لتسريع عمليات الملفات، والتي تتضمن عادةً:

  • تخزين بيانات الملف في الذاكرة للوصول الأسرع.
  • محاولة نقل البيانات من الأجهزة الأبطأ مثل محركات USB إلى الذاكرة الأسرع للنظام.

ومع ذلك، مع الملفات الأكبر (فكر في 2 GiB أو أكثر)، يمكن أن تؤدي هذه العملية من التخزين المؤقت إلى عدم الكفاءة، حيث تحاول النظام إدارة ذاكرته المتاحة.

الحل: استخدام استدعاءات Win32 API

لتجاوز هذا السلوك الخاص بالتخزين المؤقت، يوفر ويندوز علامات محددة يمكن استخدامها عند العمل مع عمليات الملفات. هذه العلامات هي:

  • FILE_FLAG_WRITE_THROUGH: تضمن هذه العلامة أن الكتابات إلى الملف تُكتب مباشرة إلى جهاز التخزين ولا يتم تخزينها في الذاكرة.
  • FILE_FLAG_NO_BUFFERING: تعطل هذه العلامة ذاكرة التخزين المؤقت للنظام للملف، مما يعني أن جميع عمليات القراءة والكتابة تذهب مباشرة إلى القرص دون تخزين مؤقت.

يمكنك استخدام هذه العلامات في كود C# الخاص بك لتحقيق النسخ المباشر للملفات دون استخدام الذاكرة المؤقتة.

تنفيذ خطوة بخطوة في C#

إليك كيفية تنفيذ الحل في C#:

  1. إضافة المكتبات اللازمة: تأكد من تضمين المساحات الاسمية المطلوبة لعمليات الملفات وخدمات الارتباط.

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    
  2. إعلان عن الدوال الأصلية: تحتاج إلى الإعلان عن دوال Win32 API اللازمة.

    [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. استخدام العلامات: في دالة نسخ الملفات الخاصة بك، استخدم العلامات لإنشاء مقبضات الملفات.

    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);
    
        // تنفيذ منطق قراءة وكتابة الملف هنا...
    
        CloseHandle(sourceHandle);
        CloseHandle(destHandle);
    }
    

الاستنتاج

من خلال الخطوات الموضحة أعلاه، يمكنك نسخ الملفات الكبيرة بكفاءة دون تدخل ذاكرة التخزين المؤقت لنظام الملفات في ويندوز. هذه الطريقة مفيدة بشكل خاص عند التعامل مع الملفات ذات السعة العالية المنقولة من الأجهزة البطيئة مثل محركات USB.

للمزيد من التفاصيل، تحقق من الوثائق الخاصة بشركة مايكروسوفت حول FILE_FLAG_WRITE_THROUGH و FILE_FLAG_NO_BUFFERING.

من خلال فهم واستخدام هذه العلامات، يمكنك تحسين أداء عمليات الملفات لديك بشكل كبير. نتمنى لك تجربة برمجة ممتعة!