【问题标题】:Why does my program say "folder does not exist" when run on Windows 2008?为什么我的程序在 Windows 2008 上运行时显示“文件夹不存在”?
【发布时间】:2010-07-14 15:50:59
【问题描述】:

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

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

此消息导致程序停止,这是不好的;它不应该被打断。 我该怎么办?


P.S.:我真的不知道是在 Stack Overflow 还是 Server Fault 中发布我的问题,所以我猜应该在这里。

【问题讨论】:

  • 这是一个放置它的好地方,但如果你发布一个代码 sn-p 会更有帮助。如果我们能在发生此错误时看到它正在尝试执行的操作,则可以更轻松地帮助解决。
  • 这是发布您的问题的好地方如果您是负责解决问题的开发人员。如果您是最终用户,那么它属于超级用户或服务器故障,或者属于供应商的支持渠道。
  • 什么Delphi版本?我猜是 Delphi 2007 之前的版本,它没有考虑 UAC 和文件/文件夹/注册表虚拟化 (support.microsoft.com/kb/927387)
  • 我几乎忍不住回答“因为文件夹不存在”。
  • @Tobiasopdenbrouw:你有和“奥斯汀权力”一样的问题吗?如果是这样,您应该提出自己的问题并包含一些代码!如果没有看到代码,就无法对这个问题给出明确的答案。我没有代表这样做,但如果我这样做了,我实际上会投票结束这个问题。

标签: delphi


【解决方案1】:

如果您尝试存储在 Program Files(任一)下,它可能是 VirtualStore。看我的文章: http://www.clipboardextender.com/off-topic/vista-program-files-hide-and-seek

【讨论】:

  • 确实如此,虽然我不知道它叫那个。以提升的权限运行将允许程序在“程序文件”中运行,不是吗?
  • @Tobias - 是的,我想是的。或者关闭 UAC。提升的权限是 setup.exe 程序首先被允许在那里写入的方式。这就是为什么某些软件只能运行一次的原因——当您第一次安装它并在安装结束时说“立即运行”时。然后它不会稍后运行,或者有不同的数据。
  • @austin powers, Chris Thornton:正如 Chris Thornton 的文章中提到的,查看“%LocalAppData%\VirtualStore”并查看您要查找的文件夹是否位于那里。如果是这样,那么这就是您遇到的问题。
【解决方案2】:

您遗漏了 ... 文件夹名称。虽然这是可以理解的,但它与程序文件(在 x64 上将被分成 2 个目录)没有任何关系,对吗?

【讨论】:

  • 另一件需要注意的事情是由于 UAC 在系统文件夹中创建新文件夹。 UAC 将阻止这种情况,除非应用程序以提升的权限运行。例如,您不能只在 C:\Program Files 或 C:\Program Files (x86) 中创建一个新文件夹,除非您以提升的权限运行。
  • 确实如此。我不确定 2008 年是否使用与 W7 相同的技巧(用户 -> 应用程序数据 -> 虚拟)来“隐藏”人们试图放入 C:\Program 文件中的文件。如果可能,也可以尝试以提升的权限运行服务。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    原因是文件虚拟化(参见例如http://msdn.microsoft.com/en-us/library/bb756960.aspxhttp://technet.microsoft.com/en-us/magazine/2007.06.uac.aspx)。

    因为我们在 stackoverflow.com 而不是 serverfault.com 我想添加所有其他答案,您可以使用 Wow64DisableWow64FsRedirectionWow64RevertWow64FsRedirectionWow64EnableWow64FsRedirection 函数(请参阅 http://msdn.microsoft.com/en-us/library/aa365743.aspx)来控制文件虚拟化你的程序。在 C# 中使用此函数的示例,您可以在此处找到 http://www.pinvoke.net/default.aspx/kernel32.wow64disablewow64fsredirection

    【讨论】:

      【解决方案5】:

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

      人们提到的路径虚拟化(实际上有 2 个孩子)只会在您的应用程序试图弄乱系统文件夹时打击您。

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-03-21
        • 2023-03-05
        • 2010-11-03
        • 2014-09-25
        • 2021-09-19
        • 1970-01-01
        • 2015-08-03
        • 2020-08-23
        • 2012-12-20
        相关资源
        最近更新 更多