تحية للجميع،
عند مراقبة مجلد داخل QNAP ، يمكنني الحصول على أحداث للملفات المنشأة حديثًا. ومع ذلك ، إذا كان الملف الجديد عبارة عن دليل ، فإن المراقبة تتعطل بسبب خطأ في النظام.
أظن أن السبب في ذلك هو استمرار نسخ الملف ، لكن لا ينبغي أن يكون هذا سببًا لتعطل المستمع.
التطبيق يعمل على Windows 8.1 Pro.
إصدار البرنامج الثابت QNAP: 3.7.2 Build 20120719
تتبع المكدس:
Exception in thread Thread-3:
Traceback (most recent call last):
File "C:\Python34\lib\threading.py", line 920, in _bootstrap_inner
self.run()
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\api.py", line 146, in run
self.queue_events(self.timeout)
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\read_directory_changes.py", line 77, in queue_events
winapi_events = read_events(self._handle, self.watch.is_recursive)
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 347, in read_events
buf, nbytes = read_directory_changes(handle, recursive)
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 307, in read_directory_changes
raise e
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 303, in read_directory_changes
ctypes.byref(nbytes), None, None)
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 108, in _errcheck_bool
raise ctypes.WinError()
OSError: [WinError 58] The specified server cannot perform the requested operation.
نفس المشكلة هنا ، مع WinError 64 والرسالة: اسم الشبكة المحدد لم يعد متاحًا. يحدث هذا عندما يتم تقديم المجلد من خادم ملفات يصبح غير متوفر (مشاركة SMB).
كيف يمكننا اكتشاف هذا النوع من الخطأ ، لإعادة محاولة إرفاق مراقب لاحقًا؟
أنا الآن أبحث أيضًا عن حل لتأخير / إعادة محاولة مؤشر ترابط dirwatcher على:
خطأ في نظام التشغيل: [WinError 64] اسم الشبكة المحدد لم يعد متاحًا
واجهت نفس المشكلة حيث كنت أتلقى رسالة WinError 64 عند مراقبة مشاركة ملف بعيد. انتهى بي الأمر بإنشاء غلاف صغير حول فئة watchdog.utils.BaseThread التي تتيح لي اكتشاف الخطأ واستعادته. ثم أقوم بتثبيت فئة BaseThread الأصلية باستخدام برنامج التضمين الخاص بي قبل إنشاء Observer. في حالتي المحددة ، ألتقط أي استثناءات يمكن أن تحدث في طريقة التشغيل وأضفها إلى قائمة انتظار ليتم استهلاكها في سلسلة مختلفة. إنه حل مبتكر ، لكن لا يوجد الكثير من الخيارات بدون تغييرات كود المصدر.
import logging
import threading
import watchdog.utils
logger = logging.getLogger(__name__)
class BaseThreadWrapper(watchdog.utils.BaseThread):
"""
Wrapper around watchdog BaseThread class.
"""
queue = None
def __init__(self):
super(BaseThreadWrapper, self).__init__()
self._original_run = self.run
self.run = self.run_wrapper
def run_wrapper(self):
try:
self._original_run()
except Exception as e:
logger.exception('%s thread exited with error',
threading.current_thread().name)
self.queue.put(e)
watchdog.utils.BaseThread = BaseThreadWrapper
ما الحل (يتغير رمز) الذي تريد أن تراه في المراقبة؟
التعليق الأكثر فائدة
أنا الآن أبحث أيضًا عن حل لتأخير / إعادة محاولة مؤشر ترابط dirwatcher على:
خطأ في نظام التشغيل: [WinError 64] اسم الشبكة المحدد لم يعد متاحًا