【问题标题】:TPath.GetTempFileName replies "The directory name is invalid"TPath.GetTempFileName 回复“目录名无效”
【发布时间】:2016-08-24 15:25:40
【问题描述】:

TPath.GetTempFileName(封装了 WinAPI GetTempFileName)在从登录到域的用户运行的应用程序调用时回复“目录名称无效”。

如果他们使用不使用域的登录名,它可以工作。

遇到问题的客户在另一个国家/地区,我也不熟悉如何更改域控制器的配置以避免此问题。

我假设由于我的应用程序不能正常工作,我应该以不同的方式获取临时文件名。

“以管理员身份运行”没有帮助。

我已指示他们确保他们可以完全控制 TEMP 和 TMP 系统环境变量中提到的文件夹,显然他们可以控制,但仍然会出现相同的错误。

我的应用程序是一个 Win32 Delphi 桌面应用程序,但由于 Windows 是错误的来源,我认为这些信息的用处有限。

Windows 10 是操作系统。

【问题讨论】:

  • 另外,GetTempFileName replies "The directory name is invalid" 是什么意思?这是调用此函数后从 Windows 返回的错误消息吗?
  • TPath.GetTempFileName 失败,我不明白为什么。将为问题添加一些额外的信息。他们在世界的另一端,我无法在这里制造类似的情况。寻求某种建议我做错了什么或没有考虑到什么似乎更聪明。已经使用 TPath.GetTempFileName 好几年了,没有任何困难。
  • TPath.GetTempFileName 引发异常“目录名称无效”。我试图概括这个问题,因为很明显 Windows 的 GetTempFileName() 是返回错误并导致异常的那个。
  • 你的程序是正确的,你不应该改变它。您的用户需要修复损坏的系统。
  • 其实在我看来是有错误的。如果 API 调用失败,GetTempPath 应该引发操作系统错误。相反,它返回空字符串。这就是这里发生的事情。但是 GetTempPath 应该会失败。

标签: windows delphi temp


【解决方案1】:

TPath.GetTempFileName 一开始就调用TPath.GetTempPath,但在使用返回的路径调用Winapi.Windows.GetTempFileName 之前不检查它。

对TPath.GetTempPath 的调用很可能返回空路径或无效路径。

MSDN 说:

GetTempPath 函数按以下顺序检查环境变量是否存在,并使用找到的第一个路径:

  1. TMP 环境变量指定的路径。
  2. TEMP 环境变量指定的路径。
  3. USERPROFILE 环境变量指定的路径。
  4. Windows 目录。

如果它返回 Windows 目录,则调用不会因上述消息而失败。因此,这三个环境变量之一可能存在错误的路径。

您的客户应检查这些变量并验证它们是否存在。 你说,这些路径“显然”没问题。

经验告诉我怀疑客户说他们检查了什么......您可以先致电TPath.GetTempPath,然后再致电TPath.GetTempFileName检查它是否存在。或者,您可以在失败的情况下调用它作为处理引发的异常的一部分,并添加错误消息的路径。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-04-18
  • 2010-09-08
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多