【问题标题】:How to know that a file was opened ? QT如何知道文件被打开了? QT
【发布时间】:2024-01-09 18:46:02
【问题描述】:

我想知道用户是否打开了文件以供阅读(双击或使用...打开),我正在 Windows 上使用 Qt Creator 编写 C++ 应用程序,经过一些研究我发现 QFileSystemWatche,但只有在特定文件夹中发生更改时它才会让我知道。

void QFileSystemWatcher::fileChanged ( const QString & path ) [信号] 当指定路径的文件是 修改、重命名或从磁盘中删除。

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

有什么建议!!!

【问题讨论】:

  • @tune2fs 我的目的是了解用户单击或在程序中打开文件的那一刻是否打开了文件,一些如何将打开它的信号连接到插槽,我希望这是更清晰。
  • “已打开文件”的问题没有明确定义;例如,如果文件驻留在共享驱动器(NAS 存储)上,而另一台远程计算机访问它,您将无法收到通知,因为没有网络文件系统为此目的提供服务器推送回调。另外,如果有人打开文件并立即再次关闭,通知您是否正确?一般来说......这是您可以通过系统跟踪/调试实用程序(SysInternals procmon / filemon)提取的信息 - 出于某种原因。
  • 正在为创建的本地文件工作,我需要在用户打开它时处理通知,这是我的观点。

标签: c++ file qt4 signals-slots qfilesystemwatcher


【解决方案1】:

2 个解决方案:

  • 使用 Qt

您可以制作以下函数(伪代码):

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

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

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

  • 使用系统 API

您可以获取所有进程的所有文件句柄的列表,然后检查它是否包含您要监视的文件的句柄。同样,您必须每秒执行 x 次。它会减慢你的电脑;它在实践中并不是真正可移植的(所需的代码很大程度上取决于特定于系统的 API),并且可能需要提升权限才能工作。我也不推荐...

【讨论】:

  • 感谢@Synxis 的解决方案,但我认为它很难接受,因为你说它会降低我的电脑速度,我想要一个最佳解决方案,让我知道用户是否点击文件打开它或一个进程尝试打开它并从磁盘读取数据,谢谢你:)
  • 顺便说一下,我知道的唯一快速解决方案是编写文件系统驱动程序,这比您想要的功能要多得多。
  • 是的,你完全正确,我有创建文件系统驱动程序或过滤系统驱动程序的想法,但我是新手,时间紧迫,我对 WDK 一无所知,所以我要求简单的方法来做到这一点。
最近更新 更多