如何检查文件何时完成在Python中复制?

时间:2012-10-10 16:35:31

标签: python unix file-io background-process updates

我想找出一种方法来警告python脚本文件完成复制。这是场景:

  1. 脚本通过不断轮询to_print来监视文件夹os.listdir()

  2. 每当os.listdir()返回存在以前未曾见过的文件的文件列表时,脚本就会对该文件执行一些操作,包括打开它并操纵其内容。

  3. 当文件较小时,这很好,并且将文件从其原始源复制到正在观看的目录所花费的时间少于os.listdir()下次轮询之前的剩余时间。但是,如果轮询并找到文件,但它仍处于被复制的过程中,则当脚本尝试对其执行操作时,文件内容将损坏。

    相反,我希望能够(使用os.stat或其他方式)知道当前正在复制文件,并等待它完成,直到我采取行动为止。

    我目前的想法是每次找到新文件时都使用os.stat(),然后等到下次轮询并比较自上次轮询以来修改/创建的日期,如果它们保持不变那么该文件是“稳定的”,否则保持轮询直到它。我不确定这会工作,因为我不太熟悉Linux / Unix如何更新这些值。

2 个答案:

答案 0 :(得分:2)

尝试inotify

这是用于观看文件的Linux标准。对于您的用例,事件IN_CLOSE_WRITE似乎很有希望。有一个Python library for inotify。一个非常简单的例子(取自there)。您需要修改它以仅捕获IN_CLOSE_WRITE个事件。

# Example: loops monitoring events forever.
#
import pyinotify

# Instanciate a new WatchManager (will be used to store watches).

wm = pyinotify.WatchManager()
# Associate this WatchManager with a Notifier (will be used to report and
# process events).

notifier = pyinotify.Notifier(wm)
# Add a new watch on /tmp for ALL_EVENTS.
wm.add_watch('/tmp', pyinotify.ALL_EVENTS) # <-- replace by IN_CLOSE_WRITE

# Loop forever and handle events.
notifier.loop()

以下是一个广泛的API文档:http://seb-m.github.com/pyinotify/

答案 1 :(得分:1)

由于可以在轮询间隔内复制文件,因此在检查新文件之前,只需处理 last 轮询找到的新文件。换句话说,而不是:

while True:
    newfiles = check_for_new_files()
    process(newfiles)
    time.sleep(pollinterval)

这样做:

newfiles = []

while True:
    process(newfiles)
    newfiles = check_for_new_files()
    time.sleep(pollinterval)

或者只是将等待放在循环的中间(实际上是相同的效果):

while True:
    newfiles = check_for_new_files()
    time.sleep(pollinterval)
    process(newfiles)