こんにちは、みんな、
QNAP内のフォルダーを監視すると、新しく作成されたファイルのイベントを取得できます。 ただし、新しいファイルがディレクトリの場合、ウォッチドッグはシステムエラーでクラッシュします。
ファイルがまだコピーされているためだと思いますが、それがリスナーをクラッシュさせる理由にはならないはずです。
アプリケーションはWindows8.1Proで実行されています。
QNAPファームウェアバージョン:3.7.2ビルド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:[WinError64]指定されたネットワーク名は使用できなくなりました
リモートファイル共有を監視しているときにWinError64メッセージが表示されるのと同じ問題が発生しました。 最終的に、watchdog.utils.BaseThreadクラスの周りに小さなラッパーを作成して、エラーをキャッチして回復できるようにしました。 次に、オブザーバーを作成する前に、ラッパーを使用して元のBaseThreadクラスにモンキーパッチを適用します。 私の特定のケースでは、runメソッドで発生する可能性のある例外をキャッチし、それらをキューに追加して、別のスレッドで使用します。 これはハッキーなソリューションですが、ソースコードを変更しない限り多くのオプションはありません。
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スレッドを遅延/再試行するための解決策を探しています:
OSError:[WinError64]指定されたネットワーク名は使用できなくなりました