Qt或PyQt - 检查文件何时被另一个进程使用。等到完成复制

时间:2012-03-13 10:01:15

标签: qt copy pyqt4 monitor

早上好, 当大文件大目录完成复制时,检查的最佳策略是什么? 我想等到文件完全完成复制。 q

中是否有代码示例

我正在研究mac os x。

感谢

更新

我使用QFileSystemWatcher。问题是我在复制它时正在接收文件或目录更改通知。所以用户复制一个大文件夹(在很多文件里面),操作系统复制过程启动,需要5分钟,但同时我的应用程序收到文件更改通知。这是一个问题,因为当我收到更改通知时,我的应用程序开始对该文件执行某些操作,但副本已经在进行中!!!!

4 个答案:

答案 0 :(得分:2)

只有一种可靠的方法:更改复制过程以写入临时文件,然后在复制完成后重命名它们。

这样,您可以忽略以.tmp结尾的新文件,并且重命名是原子操作。

如果您无法更改复制过程,您只需添加一个计时器等待半小时,以确保副本真正完成。

更细粒度(风险更大)的方法是添加一个检查文件大小的循环,并在文件大小在一段时间内没有变化时停止,但这也很难做到。

更糟糕的是,这并不妨碍您阅读部分文件(当复制过程在中间终止时)。

答案 1 :(得分:0)

尝试使用QtConcurrent框架。 特别是,请查看QFuture和QFutureWatcher。您可以在QFuture对象内执行异步复制操作,并通过信号和插槽监视其进度。

bool copyFunction() {
  // copy operations here, return true on success
}

MyHandlerClass myObject;
QFutureWatcher<bool> watcher;
connect(&watcher, SIGNAL(finished()), &myObject, SLOT(handleFinished()));
QFuture<bool> future = QtConcurrent::run(copyFunction);

答案 2 :(得分:0)

我认为QFileSystemWatcher是您开始进行更改监控的正确开始,但正如您所发现的,这些更改是 ANY 更改。从这一点来看,我认为只需检查文件的修改时间就足够了。

这是一个Watcher类的简单示例,它允许您指定要监视的文件,并查看它是否在给定时间后被修改。它可以运行回调或发出任何人都可以观看的信号:

import os.path
import time

from PyQt4 import QtCore

class Watcher(QtCore.QObject):

    fileNotModified = QtCore.pyqtSignal(str)

    MOD_TIME_DIFF = 5 #seconds

    def __init__(self, aFile, callback=None, checkEvery=5):
        super(Watcher, self).__init__()

        self.file = aFile
        self.callback = callback

        self._timer = QtCore.QTimer(self)
        self._timer.setInterval(checkEvery*1000)
        self._timer.timeout.connect(self._checkFile)

    def _checkFile(self):
        diff = time.time() - os.path.getmtime(self.file)
        if diff > self.MOD_TIME_DIFF:
            self._timer.stop()

            self.fileNotModified.emit(self.file)

            if self.callback:
                self.callback()

    def start(self):
        self._timer.start()

    def stop(self):
        self._timer.stop()

使用它的一个例子:

def callbackNotify():
    print "Callback!"

def signalNotify(f):
    print "Signal: %s was modified!" % f

# You could directly give it a callback
watcher = Watcher("/path/to/file.file", callback=callbackNotify)
# Or could use a signal
watcher.fileNotModified.connect(signalNotify)
# tell the watcher timer to start checking
watcher.start()

## after the file hasnt been modified in 5 seconds  ##
# Signal: /path/to/file.file was modified!
# Callback!

答案 3 :(得分:0)

由于您无法控制外部应用程序,我的建议是您在处理文件时锁定文件。这样,其他程序在锁定时将无法访问它们。

或者,如果您可以访问其他程序的源代码,则应该通过套接字,消息或您喜欢的任何方法实现某种形式的进程间通信。