早上好, 当大文件大目录完成复制时,检查的最佳策略是什么? 我想等到文件完全完成复制。 q
中是否有代码示例我正在研究mac os x。
感谢
更新
我使用QFileSystemWatcher。问题是我在复制它时正在接收文件或目录更改通知。所以用户复制一个大文件夹(在很多文件里面),操作系统复制过程启动,需要5分钟,但同时我的应用程序收到文件更改通知。这是一个问题,因为当我收到更改通知时,我的应用程序开始对该文件执行某些操作,但副本已经在进行中!!!!
答案 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)
由于您无法控制外部应用程序,我的建议是您在处理文件时锁定文件。这样,其他程序在锁定时将无法访问它们。
或者,如果您可以访问其他程序的源代码,则应该通过套接字,消息或您喜欢的任何方法实现某种形式的进程间通信。