Delphi 为什么我的程序会说;文件夹不存在";什么时候在Windows 2008上运行?

Delphi 为什么我的程序会说;文件夹不存在";什么时候在Windows 2008上运行?,delphi,Delphi,我们有一个Delphi程序,其任务类似于服务程序。它会在一段时间内监视一个特定文件夹,在Windows XP和2003上效果很好,但在Windows 2008r2 64位上,当它想要创建一个自动文件夹时,它会显示以下消息: 这个。。。文件夹不存在。文件可能已被移动或删除 此消息导致程序停止,这是不好的;它不应该被打断。 我能做些什么 注:我真的不知道是将我的问题发布在堆栈溢出还是服务器故障中,所以我猜它应该在这里。您忽略了。。。文件夹名。虽然这是可以理解的,但它不会碰巧与程序文件(在x64上将

我们有一个Delphi程序,其任务类似于服务程序。它会在一段时间内监视一个特定文件夹,在Windows XP和2003上效果很好,但在Windows 2008r2 64位上,当它想要创建一个自动文件夹时,它会显示以下消息:

这个。。。文件夹不存在。文件可能已被移动或删除

此消息导致程序停止,这是不好的;它不应该被打断。 我能做些什么



注:我真的不知道是将我的问题发布在堆栈溢出还是服务器故障中,所以我猜它应该在这里。

您忽略了。。。文件夹名。虽然这是可以理解的,但它不会碰巧与程序文件(在x64上将拆分为两个目录)有任何关系,是吗?

如果您试图存储在程序文件(任意一个)下面,它很可能是VirtualStore。见我的书面报告:

Windows Server 2008能够使用“虚拟”文件路径。这意味着:“你看到的是而不是你得到的”。Windows资源管理器只显示“显示”名称。如果您尝试使用的路径确实存在,请使用cmd.exe检查文件路径。

原因是文件虚拟化(请参阅示例和)


因为我们是在stackoverflow.com上而不是在serverfault.com上,所以我想添加到所有其他答案中,您可以使用
WOW64禁用WOW64FSRedirection
Wow64RevertWow64FsRedirection
WOW64启用WOW64FSRedirection
函数(请参阅)来控制程序中的文件虚拟化。在C#中使用此函数的示例可以在这里找到。

您需要告诉我们确切的路径以及如何构建它。它可以像应用程序一样简单,不使用env变量扩展,而是假设用户的文件夹位于以前的位置

只有当你的应用程序试图弄乱系统文件夹时,人们提到的路径虚拟化(实际上有两个孩子)才会击中你

如果您不扩展APPDATA、LOCALAPPDATA等环境变量,并且不希望在Win7和2k8上有更多的环境变量,则会遇到更令人费解的问题。不仅用户文件的默认路径发生了更改,而且其中一些文件还可以位于网络共享中—对于同一用户。所以,如果您是基于这样的期望运行的,即所有用户的内容都将位于特定的路径,比如说%USERPROFILE%,那么您可能会遇到一些意外情况。另请注意%ProgramData%

找到答案的最快方法-打开cmd.exe,运行set,如果您看到一些正在以其他方式构建的路径,请注意,您需要开始为它们扩展环境变量。然后以32位应用程序的形式打开cmd.exe并再次选中set。您还可以通过Process Explorer从一些运行32位或64位应用程序中获取它们


将应用程序切换到64位版本将解决大多数虚拟化问题,但不会解决环境变量扩展。此外,如果你的应用程序正在接触系统文件夹,你需要从代码中请求提升运行,或者更好地制作清单并在那里声明。然后,若用户的UAC开启,操作系统会在前面对用户大喊大叫,你们的应用程序将避免第二次虚拟化。顺便说一句,虚拟化是可以通过组策略控制的,因此它可能出现在某些框中,而在其他框中则不存在。

这是一个放置虚拟化的好地方,但如果您发布一段代码片段,它会更有帮助。如果我们能看到当这个错误发生时它试图执行什么,这将使它更容易帮助解决。如果你是负责修复它的开发人员,这是一个发布你的问题的好地方。如果您是最终用户,那么它属于超级用户或服务器故障,或者属于供应商的支持渠道。什么是Delphi版本?我猜在Delphi 2007之前,它没有考虑UAC和文件/文件夹/注册表虚拟化(),我几乎忍不住回答“因为文件夹不存在”。@Tobiasopdenbrouw:你和“austin powers”有同样的问题吗?如果是这样,你应该问你自己的问题,并包括一些代码!没有看到代码,就无法给出这个问题的明确答案。我没有代表这样做,但如果我这样做了,我会投票结束这个问题。另一件要注意的事情是由于UAC在系统文件夹中创建新文件夹。除非应用程序以提升的权限运行,否则UAC将阻止此操作。例如,除非您使用提升的权限运行,否则不能仅在C:\Program Files或C:\Program Files(x86)中创建新文件夹。确实如此。我不确定2008年是否使用与W7相同的技巧(用户->应用数据->虚拟)来“隐藏”人们试图放在C:\Program文件中的文件。如果可能的话,也可以尝试使用提升的权限运行该服务。事实上,尽管我不知道它被称为提升权限。在提升权限下运行将允许程序在“程序文件”中运行,不是吗?@Tobias-是的,我认为是这样。或者关闭UAC。提升权限是允许setup.exe程序首先在那里写入的方式。这就是为什么有些软件只工作一次——当你第一次安装它并在安装结束时说“立即运行”。然后它就不会再运行,或者有不同的数据。@austin powers,Chris Thornton:正如Chris Thornton的文章所提到的,查看“%LocalAppData%\VirtualStore”中是否有您要查找的文件夹。如果是这样,那么这就是您遇到的问题。