كيف يمكنني نسخ ملف كبير على Windows بدون CopyFile أو CopyFileEx؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

هناك قيود على نظام التشغيل Windows Server 2003 تمنعك من نسخ ملفات كبيرة للغاية، بما يتناسب مع حجم ذاكرة الوصول العشوائي (RAM) الموجودة لديك.يوجد القيد في وظيفتي CopyFile وCopyFileEx، اللتين تستخدمهما xcopy وExplorer وRobocopy وفئة .NET FileInfo.

إليك الخطأ الذي حصلت عليه:

لا يمكن نسخ [اسم الملف]:توجد موارد النظام غير كافية لإكمال الخدمة المطلوبة.

هو أ مقالة قاعدة المعرفة حول هذا الموضوع، ولكنه يتعلق NT4 و 2000.

هناك أيضا اقتراح ل استخدم الأداة المساعدة ESEUTIL من تثبيت Exchange، ولكن لم يحالفني الحظ في تشغيل ذلك.

هل يعرف أحد طريقة سريعة وسهلة للتعامل مع هذا؟أنا أتحدث عن أكثر من 50 جيجا بايت على جهاز مزود بذاكرة وصول عشوائي (RAM) سعة 2 جيجا بايت.أخطط لتشغيل Visual Studio وأكتب شيئًا ما للقيام بذلك من أجلي، ولكن سيكون من الجيد أن يكون لدي شيء موجود بالفعل ومستقر ومختبر جيدًا.

[يحرر] لقد قدمت رمز C# للعمل لمرافقة الإجابة المقبولة.

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

المحلول

الخيار الأفضل هو مجرد فتح الملف الأصلي للقراءة، والملف الوجهة للكتابة ثم تكرار نسخه كتلة تلو الأخرى.في الكود الزائف:

f1 = open(filename1);
f2 = open(filename2, "w");
while( !f1.eof() ) {
  buffer = f1.read(buffersize);
  err = f2.write(buffer, buffersize);
  if err != NO_ERROR_CODE
    break;
}
f1.close(); f2.close();

[تحرير بواسطة السائل] حسنًا، هكذا يبدو الأمر في لغة C# (إنه بطيء ولكن يبدو أنه يعمل بشكل جيد، ويعطي تقدمًا):

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace LoopCopy
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine(
                  "Usage: LoopCopy.exe SourceFile DestFile");
                return;
            }

            string srcName = args[0];
            string destName = args[1];

            FileInfo sourceFile = new FileInfo(srcName);
            if (!sourceFile.Exists)
            {
                Console.WriteLine("Source file {0} does not exist", 
                    srcName);
                return;
            }
            long fileLen = sourceFile.Length;

            FileInfo destFile = new FileInfo(destName);
            if (destFile.Exists)
            {
                Console.WriteLine("Destination file {0} already exists", 
                    destName);
                return;
            }

            int buflen = 1024;
            byte[] buf = new byte[buflen];
            long totalBytesRead = 0;
            double pctDone = 0;
            string msg = "";
            int numReads = 0;
            Console.Write("Progress: ");
            using (FileStream sourceStream = 
              new FileStream(srcName, FileMode.Open))
            {
                using (FileStream destStream = 
                    new FileStream(destName, FileMode.CreateNew))
                {
                    while (true)
                    {
                        numReads++;
                        int bytesRead = sourceStream.Read(buf, 0, buflen);
                        if (bytesRead == 0) break; 
                        destStream.Write(buf, 0, bytesRead);

                        totalBytesRead += bytesRead;
                        if (numReads % 10 == 0)
                        {
                            for (int i = 0; i < msg.Length; i++)
                            {
                                Console.Write("\b \b");
                            }
                            pctDone = (double)
                                ((double)totalBytesRead / (double)fileLen);
                            msg = string.Format("{0}%", 
                                     (int)(pctDone * 100));
                            Console.Write(msg);
                        }

                        if (bytesRead < buflen) break;

                    }
                }
            }

            for (int i = 0; i < msg.Length; i++)
            {
                Console.Write("\b \b");
            }
            Console.WriteLine("100%");
            Console.WriteLine("Done");
        }
    }
}

نصائح أخرى

إذا كنت تريد كتابة تعليمات برمجية، فإن إحدى الطرق التي يمكنك تحسينها هي إرسال الملف على شكل أجزاء (مثل استخدام متوم).لقد استخدمت هذا الأسلوب لإرسال ملفات ضخمة من مركز البيانات إلى مكتبنا للطباعة.

تحقق أيضًا من الأداة المساعدة TeraCopy المذكورة هنا..

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