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

StackOverflow https://stackoverflow.com/questions/48679

سؤال

أي شخص يعرف طريقة نسخ ملف من مسار إلى مسار ب وقمع نظام الملفات ويندوز ذاكرة التخزين المؤقت ؟
الاستخدام النموذجي هو نسخ ملف كبير من محرك أقراص USB أو server على الجهاز المحلي الخاص بك.ويندوز يبدو لمبادلة كل شيء إذا كان الملف كبير جدا, على سبيل المثال2GiB.تفضل المثال في C#, ولكن أعتقد أن هذا سيكون Win32 الاتصال من نوع ما إذا كان ذلك ممكنا.

هل كانت مفيدة؟

المحلول

حتى أكثر أهمية ، هناك FILE_FLAG_WRITE_THROUGH و FILE_FLAG_NO_BUFFERING.

MSDN لطيفة المادة على كل منهم: http://support.microsoft.com/kb/99794

نصائح أخرى

في C# لقد وجدت شيئا مثل هذا ، يمكن تغيير نسخة مباشرة إلى الملف الوجهة:

    public static byte[] ReadAllBytesUnbuffered(string filePath)
    {
        const FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;
        var fileInfo = new FileInfo(filePath);
        long fileLength = fileInfo.Length;
        int bufferSize = (int)Math.Min(fileLength, int.MaxValue / 2);
        bufferSize += ((bufferSize + 1023) & ~1023) - bufferSize;
        using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None,
                                           bufferSize, FileFlagNoBuffering | FileOptions.SequentialScan))
        {
            long length = stream.Length;
            if (length > 0x7fffffffL)
            {
                throw new IOException("File too long over 2GB");
            }
            int offset = 0;
            int count = (int)length;
            var buffer = new byte[count];
            while (count > 0)
            {
                int bytesRead = stream.Read(buffer, offset, count);
                if (bytesRead == 0)
                {
                    throw new EndOfStreamException("Read beyond end of file EOF");
                }
                offset += bytesRead;
                count -= bytesRead;
            }
            return buffer;
        }
    }

أنا لست متأكدا مما إذا كان هذا يساعد ، ولكن نلقي نظرة على زيادة الأداء باستخدام FILE_FLAG_SEQUENTIAL_SCAN.

ملخص

هناك CreateFile() ودعا FILE_FLAG_SEQUENTIAL_SCAN التي سيتم توجيه إدارة التخزين المؤقت إلى الوصول إلى الملف بالتتابع.

أي شخص يقرأ يحتمل أن تكون ملفات كبيرة مع الوصول المتسلسل يمكن تحديد هذا العلم من أجل زيادة الأداء.هذا العلم هو مفيد إذا كنت تقرأ الملفات "في الغالب" متتابعة ، لكنك أحيانا تخطي صغيرة سلاسل من وحدات البايت.

إذا كنت لا تمانع باستخدام الأداة المساعدة ESEUTIL عملت كبيرة بالنسبة لي.

يمكنك التحقق من هذا بلوق دخول مقارنة مخزنة و NonBuffered IO وظائف و من أين يمكن الحصول على الأداة المساعدة ESEUTIL.

نسخ بعض النصوص من technet بلوق:

حيث تبحث في تعريف I/O المخزن أعلاه, يمكننا أن نرى حيث ينظر إلى مشاكل في الأداء الكذب في ذاكرة التخزين المؤقت لنظام الملفات النفقات العامة.Unbuffered (I/O أو ملف raw نسخ) هو المفضل عند محاولة نسخ ملف كبير من موقع واحد إلى آخر عندما لا تنوي الوصول إلى الملف المصدر بعد نسخة كاملة.هذا سوف تجنب ذاكرة التخزين المؤقت لنظام الملفات النفقات العامة ومنع ذاكرة التخزين المؤقت لنظام الملفات بفعالية مسح الملفات الكبيرة من البيانات.العديد من التطبيقات إنجاز هذا عن طريق الاتصال CreateFile() لإنشاء فارغة الملف الوجهة ، ثم باستخدام طلب & readfile() و WriteFile() وظائف لنقل البيانات.CreateFile() - دالة CreateFile يخلق أو يفتح ملف, ملف ستريم, دليل, القرص الفعلي, الصوت, وحدة المخزن المؤقت محرك الشريط الاتصالات الموارد ، mailslot ، أو توجيه إخراج مسمى.ترجع الدالة مقبض التي يمكن استخدامها للوصول إلى كائن.طلب & readfile() - على طلب & readfile وظيفة يقرأ البيانات من ملف ، ويبدأ في موقف مؤشر الملف إلى.يمكنك استخدام هذه الوظيفة لكل من المتزامن وغير المتزامن العمليات.WriteFile() - الدالة WriteFile يكتب البيانات إلى ملف في الموضع المحدد من قبل مؤشر الملف.هذه هي وظيفة صمم لكلا متزامن و غير متزامن العملية.لنسخ الملفات حول الشبكة التي تكون كبيرة جدا ، نسختي فائدة من اختيار الأداة المساعدة ESEUTIL التي تعد واحدة من قاعدة بيانات المرافق المتوفرة مع الصرف.

الأداة المساعدة Eseutil هو الجواب الصحيح أيضا منذ Win7 / 2008 R2 يمكنك استخدام رمز التبديل /j في Xcopy والذي له نفس التأثير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top