سؤال

أنا أكتب تطبيقًا يمكنه نسخ الملفات على مشاركة الشبكة. عادة ما يتم نقل الملفات على نفس القرص الصلب الفعلي. إذا قمت باختبار هذا باستخدام Windows Explorer ، فسيتم تنفيذ هذه العملية بسرعة. يبدو أن Windows يعرف عن نفس الموقع ويقوم بحركة حقيقية وليس نسخة وحذف (والتي ستكون أبطأ).

لنفترض أنك تريد نسخ مجموعة من الملفات:

\\computer\share\fileA.txt
\\computer\share\fileB.txt

الوجهة على سبيل المثال:

\\computer\share\subfolder

يستخدم التطبيق واجهة برمجة تطبيقات Windows Shell (كتبت التطبيق في Delphi ، ولكن يجب أن تكون المشكلة هي نفسها بالنسبة للغات الأخرى أيضًا):

with SHFileOpStruct do
  begin
  Wnd := 0;
  wFunc := FO_MOVE;
  pFrom := PChar ('\\computer\share\fileA.txt'+#0 
                  +'\\computer\share\fileB.txt'+ #0#0);
  pTo   := PCahr ('\\computer\share\subfolder' + #0#0);
  fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
  end;

Result := SHFileOperationW (SHFileOpStruct);

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

أم أن هناك وظيفة API مختلفة تستخدم بواسطة Windows Explorer؟

لمقارنة قصيرة:

  • عدد الملفات: 260
  • حجم الملف لكل ملف من الملفات: 11 كيلو بايت
  • حان الوقت للتحرك في المستكشف: 2 ثانية
  • حان الوقت للتحرك مع shfileOperation: 20 ثانية

أنا أستخدم Windows 7 على نظام التطوير الخاص بي ، ولكن يجب أن يعمل أيضًا على XP ، لذلك لا يمكنني استخدام واجهة IfileOperation الجديدة.

أطيب التحيات

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

المحلول

أود تجاهل وظائف SHELL API ، والاستخدام MoveFileEx أو MoveFileWithProgress مباشرة.

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