【问题标题】:Delphi - refresh the shell or file listDelphi - 刷新外壳或文件列表
【发布时间】:2012-08-19 14:18:30
【问题描述】:

我的 Delphi 应用程序经常删除文件等,如果用户正在浏览该目录,我想让它自动刷新。

例如,我的电脑应该会自动刷新。

我用谷歌搜索过,但没有找到任何东西。我不知道该怎么做:/

为任何建议干杯! 阿德里安

【问题讨论】:

  • 我记得在 TortoiseSVN 邮件列表中看到无法刷新左侧浏览器窗格。可以从 Windows shell 扩展刷新右侧窗格。我想您可以尝试找到窗口句柄并向其发送 F5 键击。
  • 在 Vista 及以上版本中,文件列表视图将更新。在 XP 上不会,因为 XP 资源管理器就是这样设计的。您应该坚持使用默认的系统行为。请记住,您的应用程序的行为与资源管理器完全相同。

标签: delphi shell


【解决方案1】:

删除文件时调用SHChangeNotify() 函数。这将通知外壳程序,而外壳程序又将通知它的观察者,例如 Windows 文件资源管理器。 TortoiseSVN 就是这样做的 (Evidence here)。

另见:

  1. How to refresh Windows Explorer
  2. How can I programmatically refresh Windows Explorer?

【讨论】:

  • 这不是必需的。尝试调用 DeleteFile 并观察项目在您的资源管理器窗口中消失。
  • 未测试,但我相信在 XP 和 Windows 2000 中不会发生这种情况。因此 SHChangeNotify() 的目的是使其也能在旧操作系统上进行更新。
  • 我在对 Q 的评论中已经说过了。但是,我认为违背系统默认行为会很奇怪。我相信这会导致性能问题,因为 XP 资源管理器会一次枚举整个文件夹,这与后来的操作系统不同。你有没有测试过这个 SHChangeNotify 是否对 XP 有预期的效果。在我看来,它是为其他目的而设计的。
  • OP 提出了这个问题,这是正确的答案。您可以就他是否应该尝试在 XP 中这样做进行辩论,但这将是一个侧边栏,并且恕我直言,这是一个相当弱的论点。
  • 我无法从这些链接中确定更新是否适用于删除后的文件列表。您应该将哪些参数传递给该函数?我认为我关于 Vista+ 的观点是非常有效的。在 Vista+ 上删除文件后调用该函数会很疯狂。你应该编辑你的答案来说明这一点。并且还讨论了 XP 上的性能问题。不过,这只是我的看法。
【解决方案2】:

也可以使用 TShellChangeNotifier 组件来处理 shell 的变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 2020-04-02
    相关资源
    最近更新 更多