كشف الملفات التي تم نقلها باستخدام filesystemwatcher

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

  •  18-09-2019
  •  | 
  •  

سؤال

أدرك أن FileSystemWatcher لا يوفر حدث تحرك، بدلا من ذلك، سيولد حذف منفصل وإنشاء أحداث لنفس الملف. (يقوم الملف filesystemwatcher بمشاهدة كل من مجلدات المصدر والوجهة).

ومع ذلك، كيف يمكننا التمييز بين خطوة ملف حقيقية وبعض إنشاء ملف عشوائي له نفس الاسم كملف تم حذفه مؤخرا؟

نوع من الممتلكات من فئة FileSystemeventargs مثل "obsdeletefile" الذي تم تعيين مسار الملف المحذوف إذا كانت نتيجة لنقل، أو غير فارغة، ستكون رائعة. ولكن بالطبع هذا غير موجود.

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

تحديث بناء على ردود الفعل:

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

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

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

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

المحلول

بحسب ال مستندات:

قد تثير عمليات نظام الملفات الشائعة أكثر من حدث واحد. على سبيل المثال، عند نقل ملف من دليل واحد إلى آخر، قد يتم رفع العديد من الأحداث المحررة وبعض الأحداث غير المظلمة والمتخصص. نقل الملف هو عملية معقدة تتألف من عمليات متعددة بسيطة، وبالتالي رفع أحداث متعددة.

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

نصائح أخرى

بقدر ما أفهمها، Renamed الحدث هو للملفات التي يتم نقلها ...؟

خطأي - يقول المستندات على وجه التحديد أنه تعتبر الملفات فقط داخل مجلد نقل "إعادة تسمية" في عملية قص وصق:

يفسر نظام التشغيل وكائن FileSystemWatcher إجراءات مقطوعة وبصق أو إجراء حركة كعمل لإعادة تسمية للمجلد ومحتوياته. إذا قمت بقطع ولصق مجلد مع ملفات في مجلد يتم مشاهدته، يقوم كائن FileSystemWatcher بتقارير المجلد فقط على أنه جديد، ولكن ليس محتوياته لأنها تتم إعادة تسميتها بشكل أساسي فقط.

كما يقول حول نقل الملفات:

قد تثير عمليات نظام الملفات الشائعة أكثر من حدث واحد. على سبيل المثال، عند نقل ملف من دليل واحد إلى آخر، قد يتم رفع العديد من الأحداث المحررة وبعض الأحداث غير المظلمة والمتخصص. نقل الملف هو عملية معقدة تتألف من عمليات متعددة بسيطة، وبالتالي رفع أحداث متعددة.

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

هل لديك حالة من إبداعات ملف عشوائية تؤثر على الكشف عن التحركات؟

قد ترغب في تجربة الأحداث التي طال انتظارها و / أو ما يتراوح منها المذكورة في وثائق.

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

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

نهج آخر هو إنشاء برنامج تشغيل Minifilter الذي يتتبع عمليات نظام الملفات وإعادة توجيهها إلى طلبك. باستخدام هذا تحصل أساسا على جميع المعلومات حول ما يحدث لملفاتك وستتمكن من الحصول على معلومات حول الملفات التي تم نقلها. عيب هذا النهج هو أنه يجب عليك إنشاء برنامج تشغيل منفصل يجب تثبيته على النظام المستهدف. ومع ذلك، فإن الشيء الجيد هو أنك لن تحتاج إلى البدء من نقطة الصفر، لأنني بدأت بالفعل في إنشاء شيء مثل هذا: https://github.com/centerdevice/minifswatcher.

هذا يسمح لك ببساطة بتتبع الملفات التي تم نقلها مثل هذا:

var eventWatcher = new EventWatcher();

eventWatcher.OnRenameOrMove += (filename, oldFilename, process) =>
{
  Console.WriteLine("File " + oldFilename + " has been moved to " + filename + " by process " + process );
};

eventWatcher.Connect();
eventWatcher.WatchPath("C:\\Users\\MyUser\\*");

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

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