كيفية تحديد ما إذا كان سيتم نقل الملف منطقيا أو نقله جسديا

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

  •  09-09-2019
  •  | 
  •  

سؤال

الحقائق:

عند نقل ملف، هناك احتمالان:

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

السؤال:

كيف يمكنني تحديد ما إذا كان الملف سيتم نقله بطريقة منطقيا أو جسديا؟

أقوم بنقل الملفات الكبيرة (700+ ميغس) وسيكون اعتماد سلوكيات مختلفة لكل موقف.


يحرر:

لقد قمت بالفعل بترميز مربع حوار ملف متحرك مع موضوع عامل يقوم بإجراء مكالمة الحظر IO لنسخ الملف MEG في وقت واحد. يوفر معلومات للمستخدم مثل تقدير تقريبي للوقت المتبقي ومعدل النقل.

المشكلة هي: كيف أعرف ما إذا كان يمكن نقل الملف منطقيا قبل محاولة تحريكه جسديا؟

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

المحلول 2

حسنا أنا على شيء :)

استخدام جني انا بإمكاني ان اتصل ب Win32 API (و * NIX API أيضا) من جاوة.

حاولت الاتصال GetFileInformationByHandle ولم حصلت على نتيجة ولكن dwVolumeSerialNumber السمة دائما تساوي 0 (حاولت مع بلدي C: و d: drive)

ثم رأيت هذه الوظيفة على MSDN: MoveFileEx. وبعد عند تعيين Parametter Flag على 0، ستكون ميزة النسخة على الحركة تعطيل. ويعمل !!!!

لذلك سوف أسمي ببساطة

if (!Kernel32.INSTANCE.MoveFileEx(source.getAbsolutePath(), destination.getAbsolutePath(), 0)) {
    System.out.println("logical move failed");
}

هنا هو الرمز لوضع في Kernel32.java واجهة (يمكن العثور على هذا الملف في حزمة SRC.zip في قسم التنزيل في جني موقع):

boolean MoveFileEx(String lpExistingFileName, String lpNewFileName, int dwFlags);

int MOVEFILE_REPLACE_EXISTING = 0x01;
int MOVEFILE_COPY_ALLOWED = 0x02;
int MOVEFILE_CREATE_HARDLINK = 0x04;
int MOVEFILE_WRITE_THROUGH = 0x08;
int MOVEFILE_DELAY_UNTIL_REBOOT = 0x10;
int MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20;

نصائح أخرى

على لينكس أو أخرى * nices، اتصل stat() على الدلائل المصدر والوجهة ومقارنة st_dev القيم. إذا كانت هي نفسها، فيمكن تنفيذ خطوة منطقية، وإلا يجب إجراء حذف النسخة المادية +.

على ويندوز، يمكنك الاتصال GetFileInformationByHandle() على مقابض إلى الدلؤين ومقارنة بهم dwVolumeSerialNumber القيم. لاحظ أن هذا يتطلب نظام التشغيل Windows 2000 أو الأحدث.

أرى أنك تستخدم Java - يجب أن يكون هناك بعض البوابة التي يمكنك من خلالها الوصول إلى معلومات نظام التشغيل هذه (ربما JNI؟)

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