2012-10-11 234 views
3

我想知道如果一个文件是由用户打开阅读(双击或打开...),我编写了一个C++应用程序与Windows上的Qt Creator,经过一些研究后,我发现QFileSystemWatche,但它让我只有在特定文件夹中发生更改时才知道。如何知道文件已打开? QT

空隙QFileSystemWatcher :: fileChanged(常量的QString &路径)[信号] 当在指定的路径中的文件是 修改,重命名或从磁盘去除这个信号被发射。

如何知道文件是否打开?或者有没有办法修改文件打开或关闭时?

任何想法请!!!

+0

看来,你不能在这里看到为什么:http://lists.trolltech.com/qt-interest/2006-01/msg00251.html – tune2fs

+0

@ tune2fs我的目的就是要知道一个文件是在用户点击还是在程序中打开的时候打开的,有些如何将它打开的信号连接到一个插槽,我希望这更清楚。 – Oumaya

+0

“文件被打开”的问题没有明确定义;例如,如果文件驻留在共享驱动器(NAS存储)上,而另一台远程计算机访问该文件,则无法获得通知,因为没有联网的文件系统具有服务器推送的回调功能。另外,如果有人打开文件并立即关闭文件,通知你是否正确?通常...这是您可以通过系统跟踪/调试实用程序(SysInternals procmon/filemon)仅提取的信息 - 出于某种原因。 –

回答

0

2解决方案:

  • 使用Qt

您可以进行下面的函数(伪):

function is_open(file) 
    handle = open file to write 
    if(handle is ok) 
     close file 
     return true 
    else 
     return false 

然后你每秒一次调用它,并放出一个信号fileOpened(const QString& file)每当is_open(t-1) == false && is_open(t) == true,其中t是时间。

但是,此解决方案可能会很慢,并且可能会导致一些io访问膨胀,尤其是如果该文件位于远程服务器上。它也可能导致磁盘/ SSD过早磨损,所以我不推荐这种解决方案。

  • 使用系统API

你可以得到所有突未的所有文件句柄的列表,然后检查是否包含句柄要监视的文件。再一次,你将不得不每秒做x次。它会减慢你的电脑;它在实践中并不真正可移植(代码需要严重依赖于特定于系统的API),并且可能需要提高权限才能工作。我不建议太...

+0

感谢@Synxis为您提供的解决方案,但我认为它很难接受它,正如您所说可能会减慢我的电脑速度,并且我希望有一个最佳解决方案,让我知道用户是否单击某个文件以打开它或尝试进行尝试打开它并从磁盘读取数据,谢谢你:) – Oumaya

+0

顺便说一句,我所知道的唯一快速解决方案是编写一个文件系统驱动程序,这比你想要的功能更有效。 – Synxis

+0

是的,你是完全正确的,我有创建一个文件系统驱动程序或过滤系统驱动程序的想法,但我是新手,时间紧迫,我对WDK一无所知,所以我要求简单的方法来做那。 – Oumaya

相关问题