【问题标题】:How to know when a file is edited?如何知道文件何时被编辑?
【发布时间】:2012-04-18 10:18:15
【问题描述】:

有没有办法(或 API)知道文本文件何时被编辑(由程序或人)并执行特定操作?

例如:我想在编辑文件 c:\Users\john\free.txt 时显示一个 MessageBox。

【问题讨论】:

  • 您可以随时检查修改后的时间戳,看看它是否会更改为新的。
  • 没有 API 可以直接为您提供该信息,请参阅此问题:stackoverflow.com/questions/1990535/…。而且,顺便说一句,程序或人在修改文件没有区别——一个人需要使用一些程序,不是吗? :)
  • @Bojan,是的。使用 FindFirstChangeNotification 和 ReadDirectoryChanges。
  • @Patrick 谢谢。今天早些时候有一个关于 Microsoft API 的问题,它通知注册表更改 (RegNotifyChangeKeyValue),在我在这里发表评论后,我在想为什么文件系统不存在一些类似的 API。就在这里! (+1 为您的回答)

标签: c++ windows winapi


【解决方案1】:

取决于你什么时候想知道它。

  • 您的应用程序是否持续运行,是否希望尽快看到任何变化?
  • 您的应用程序是需要检查一次更改的简单命令行应用程序吗?

在第二种情况下,您可以检查文件的修改日期(PoweRoy 和 Michal 建议)或使用哈希(PoweRoy 建议)。

如果您的应用程序连续运行,您应该使用 FindFirstChangeNotification 和 ReadDirectoryChanges 函数。您可以在以下页面了解更多信息:

【讨论】:

  • 将哈希方法与更改通知相结合将是解决性能和安全问题的更好方法
【解决方案2】:

最简单:比较修改日期。但这可以被操纵。

或者对原始文件进行哈希处理,然后与当前文件进行比较。

【讨论】:

  • 我会选择散列,因为它保证没有进行任何黑客攻击。
  • 有没有办法避免死循环?
【解决方案3】:

GetFileTime 应该可以帮助您。

http://msdn.microsoft.com/en-us/library/ms724320%28v=vs.85%29.aspx

还有 GetFileAttributesEx。

【讨论】:

【解决方案4】:

检查文件的最后修改日期时间。 此方法检索与给定 CFile 对象实例或给定文件路径相关的状态信息。

BOOL 获取状态( CFileStatus&rStatus ) 常量; 静态 BOOL PASCAL GetStatus( LPCTSTR lpszFileName, CFileStatus&rStatus );

参数 r状态 对将接收状态信息的用户提供的 CFileStatus 结构的引用。 CFileStatus 结构具有以下字段:

CTime m_ctime 创建文件的日期和时间。

CTime m_mtime 上次修改文件的日期和时间。

CTime m_atime 上次访问文件以进行读取的日期和时间。

ULONGLONG m_size 文件的逻辑大小(以字节为单位),由 DIR 命令报告。

BYTE m_attribute 文件的属性字节。

char m_szFullName[_MAX_PATH] Windows 字符集中的绝对文件名。

lpsz文件名 Windows 字符集中的字符串,它是所需文件的路径。路径可以是相对的或绝对的,也可以包含网络路径名。

返回值 如果成功获取指定文件的状态信息,则为 TRUE;否则,错误。 PS:资料来自MSDN

【讨论】:

  • 有没有办法避免死循环?
  • 我不知道。把 sleep(20) 放进去
  • 但是把 sleep(20);在你的循环中是避免 CPU 使用率过高的好方法。
猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2021-05-04
  • 1970-01-01
相关资源
最近更新 更多