【问题标题】:TFileListBox Component Finding Files Which No Longer ExistTFileListBox 组件查找不再存在的文件
【发布时间】:2011-10-08 09:44:40
【问题描述】:

我在 Windows 7 上使用 Delphi 7,并且有一个应用程序使用 TFileListBox 组件遍历目录中的文件并将它们复制到备份目录。

我遇到了一些奇怪的行为,即 TFileListBox 正在检测目录中不存在的文件?我要处理的目录包含 75 个文件,但 TFileListBox 检测到超过 100 个文件。

我将资源管理器设置更改为显示隐藏/系统文件,但仍然看不到这些额外文件的来源。

我想知道这个 Windows 7 以前的版本是否在这个问题中起作用,因为我相当确定 TFileListBox 检测到的额外文件曾经驻留在此目录中但被删除了......

对此的任何帮助将不胜感激。

【问题讨论】:

  • 您能告诉我们一些不存在的文件的名称吗?另外,当您在这些不存在的文件上尝试FileExists() 时会发生什么?
  • 添加 FileExists() 并不能解决问题。文件名各不相同,有 .zip、.doc 等。
  • 请告诉我们文件名!当您在不存在的文件上调用 FileExists() 时会发生什么。返回值是多少?
  • 如果你进入命令提示符并输入 dir *.* 那里有那些文件吗?
  • 我能闻到虚拟商店的味道

标签: windows delphi vcl file-copying filelist


【解决方案1】:

我们从上面的 cmets 中得出问题与虚拟化应用程序时使用的虚拟存储有关。虚拟商店是在 Windows Vista 中引入的,作为在没有管理员权限的情况下运行应用程序的一部分。这些文件出现在虚拟存储中是因为您的应用程序正在写入程序文件目录,而标准用户没有写入权限。

引入虚拟化是为了帮助处理不会重新编译以考虑新 Vista 策略的遗留应用程序。如今,您根本不应该构建虚拟化应用程序。

您可以通过将应用程序清单链接到包含<requestedExecutionLevel level="asInvoker"/> 部分的应用程序来禁用虚拟化。

当您这样做时,您无疑会发现一些其他问题,因为您的应用程序可能会尝试写入程序文件目录、注册表的 HKLM 部分等。虽然进行这些更改可能看起来很痛苦,但它们是值得努力。

【讨论】:

  • 如果它是一个旧程序,是否可以在代码中添加一些内容以便它可以在 XP 和 Vista/7 上运行?
  • @Jon 我不明白这个问题。您是否在询问清单资源是否可以添加到应用程序中并且仍然可以在 XP 上运行?如果是这样,那么是的,XP 只是忽略清单的那一部分。
  • 不,我的意思是如果 Delphi 代码说 File.Write(C:\Program Files) 代码中有什么东西需要检查 UAC 或操作系统,然后写入正确的位置或是否有一个可以指定的位置,例如 SpecialFolder.ProgramData 并且可以在 XP 和 Vista 上运行
  • @Jon 你需要找别的地方来写数据。但这是一个不同的话题。我们无法在这些 cmets 中真正处理它。与 SpecialFolder.ProgramData 等效的内容可能是合适的,但会警告用户由于某种原因无法从该位置删除。您可以考虑常见的文档位置。这完全取决于您存储的内容。请注意,目前使用 UAC,这些文件将是每个用户的。也许这对您来说实际上很好,在这种情况下,您只需将文件粘贴在用户配置文件中的某个位置即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 2016-02-06
  • 2016-03-02
  • 1970-01-01
  • 2015-12-15
相关资源
最近更新 更多