我是Python的新手,我正在尝试实现一个好的“文件创建”检测。如果我没有放time.sleep(x)
我的文件以错误的方式详细阐述,因为它们仍在文件夹中“创建”。 (缓冲区不为空)
每次创建文件时,如何在不等待x
秒的情况下绕过这个事情?
这是我的代码:
主:
while 1:
if len(parser()) > 0: # arguments are valid
if len(parser()) == 3:
log_path = parser()['log_path']
else:
log_path = os.getcwd()
paths = parser()
if paths:
handler = Event_Handler()
observer = Observer()
observer.schedule(handler, paths['src_fld'], True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
else:
exit(1)
Event_Handler类:
class Event_Handler(FileSystemEventHandler):
def on_created(self, event):
if not event.is_directory:
time.sleep(1)
正如我所说,没有time.sleep(1)
,如果我尝试处理一个大文件,我会失败,因为它仍然没有写完。
答案 0 :(得分:2)
为了将来偶然发现这个问题的读者,答案似乎是你做不到的。看门狗没有也不会支持任何功能来判断文件是否“完整”,因为Windows不允许它,而看门狗是系统无关的。
如果您使用的是Linux或某些发行版,那么inotify可能是一个安全的选择。否则,在Windows上,我发现的最佳解决方案是:
上传一个大文件,bigfile,然后另一个文件,bigfile-complete。当您找到文件 name -complete时,您将返回并上传/传输/响应原始文件 name 。在这种情况下,您的文件将全部添加到 file , file -complete, file2 ,的队列中的受监控目录中file2 - 完成,。 。
轮询文件大小,直到它保持固定一段合适的时间。当它没有经过足够长的变化而你可以合理地确定它已经完成时,就会正常反应。
类似地,当文件以零碎的方式上传到您的目录时,它将生成文件修改的Watchdog事件的恒定流。您可以轮询这些而不是文件大小,等待它们停止一段合理的时间,然后假定文件已完成并继续。
这些解决方案都不是完美的,但这似乎是Windows上Watchdog的固有问题。不幸的是,“完美”的解决方案似乎是“交换到Linux并使用inotify”。
答案 1 :(得分:0)
尝试在while循环中读取文件:
def on_created(event):
...
# WAITING FOR FILE TRANSFER
file = None
while file is None:
try:
file = open(event.src_path)
except OSError:
file = None
print("WAITING FOR FILE TRANSFER....")
time.sleep(3)
continue