سؤال

أنا أبحث عن طريقة قوية لنسخ الملفات عبر مشاركة شبكة Windows والتي تتسامح مع الاتصال المتقطع.غالبًا ما يتم استخدام التطبيق على محطات العمل اللاسلكية والمتنقلة في المستشفيات الكبيرة، وأفترض أنه يمكن فقدان الاتصال إما للحظات أو لعدة دقائق في كل مرة.يبلغ حجم الملفات المعنية عادةً حوالي 200 كيلو بايت - 500 كيلو بايت.التطبيق مكتوب بلغة VB6 (لاف)، ولكن كثيرًا ما ينتهي بنا الأمر باستخدام مكالمات Windows DLL.

شكرًا!

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

المحلول

لست واضحًا بشأن مشكلتك الفعلية، لذا سأطرح بعض الأفكار.

  • هل تريد نسخًا قابلة لإعادة التشغيل (بأحجام ملفات صغيرة جدًا، لا يبدو أنها ستكون صفقة كبيرة)؟إذا كان الأمر كذلك، انظر CopyFileEx مع COPYFILERESTARTABLE
  • هل تريد نسخًا يمكن التحقق منها؟يبدو أنك حصلت على ذلك بالفعل من خلال التحقق من التجزئة.
  • هل تريد أداء أفضل؟سيكون الأمر صعبًا، حيث يبدو أنه لا يمكنك تشغيل أي شيء على الخادم.خلاف ذلك، TransmitFile قد يساعد.
  • هل تريد فقط إشعال النار ونسيان العملية؟أفترض القصف للنسخ الآلي، أو تيراكوبي أو قد ينجح شيء ما - ولكن يبدو لي مخترقًا بعض الشيء.
  • هل تريد أن تعرف متى تعود الشبكة؟ IsNetworkAlive لديه إجابتك.

بناءً على ما أعرفه حتى الآن، أعتقد أن الكود الزائف التالي سيكون هو النهج الذي سأتبعه:

sourceFile = Compress("*.*");
destFile = "X:\files.zip";

int copyFlags = COPYFILEFAILIFEXISTS | COPYFILERESTARTABLE;
while (CopyFileEx(sourceFile, destFile, null, null, false, copyFlags) == 0) {
   do {
     // optionally, increment a failed counter to break out at some point
     Sleep(1000);
   while (!IsNetworkAlive(NETWORKALIVELAN));
}

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

نصائح أخرى

لقد استخدمت نسخة آلية لهذا مع نتائج ممتازة.افتراضيًا، ستتم إعادة المحاولة كل 30 ثانية حتى يتم نقل الملف.

حاول استخدام BITS (خدمة النقل الذكي في الخلفية).إنها البنية الأساسية التي يستخدمها Windows Update، ويمكن الوصول إليها عبر Win32 API، وهي مصممة خصيصًا لمعالجة هذه المشكلة.

يتم استخدامه عادةً لتحديثات التطبيقات، ولكن يجب أن يعمل بشكل جيد في أي موقف لنقل الملفات.

http://www.codeproject.com/KB/IP/bitsman.aspx

وأنا أتفق مع Robocopy كحل... ولهذا السبب تم استدعاء الأداة المساعدة "نسخ ملف قوي"

لقد استخدمت Robocopy لهذا مع نتائج ممتازة.افتراضيًا، ستتم إعادة المحاولة كل 30 ثانية حتى يتم نقل الملف.

وبشكل افتراضي، مليون إعادة المحاولة.يجب أن يكون هذا كثيرًا لاتصالك المتقطع.

كما أنه يقوم بإجراء عمليات نقل قابلة لإعادة التشغيل ويمكنك حتى التحكم في عمليات النقل مع وجود فجوة بين الحزم على افتراض أنك لا ترغب في استخدام النطاق الترددي بالكامل لأن البرامج الأخرى تستخدم نفس الاتصال (مفتاح / IPG)؟.

ماذا عن إرسال التجزئة بعد أو قبل إرسال الملف، ومقارنتها بالملف الذي تلقيته؟يجب أن يتأكد ذلك على الأقل من أن لديك الملف الصحيح.

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

حسنًا، يبدو أن rsync يقوم بذلك، ولا يحتاج إلى خادم/برنامج خفي/تثبيت أعتقد أنه يفعل ذلك - فقط $ rsync src dst.

الرسائل القصيرة إذا كانت متوفرة تعمل.

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