مشكلة الأداء عند نقل الملفات على أسهم الشبكة
-
27-09-2019 - |
سؤال
أنا أكتب تطبيقًا يمكنه نسخ الملفات على مشاركة الشبكة. عادة ما يتم نقل الملفات على نفس القرص الصلب الفعلي. إذا قمت باختبار هذا باستخدام 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
مباشرة.