Всем привет,
При наблюдении за папкой внутри 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 на:
OSError: [WinError 64] Указанное сетевое имя больше не доступно
У меня была такая же проблема, когда я получал сообщение WinError 64 при мониторинге удаленного общего доступа к файлам. В итоге я создал крошечную оболочку для класса watchdog.utils.BaseThread, которая позволяет мне отловить ошибку и восстановить ее. Затем я monkeypatch исходный класс 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
Какое решение (изменение кода) вы бы хотели видеть в Watchdog?
Самый полезный комментарий
Я также сейчас ищу решение, чтобы отложить / повторить поток dirwatcher на:
OSError: [WinError 64] Указанное сетевое имя больше не доступно