gpt4 book ai didi

c# - System.IO.IOException : "The file exists" when using System. IO.Path.GetTempFileName() - 解决方案?

转载 作者:IT王子 更新时间:2023-10-29 03:41:06 24 4
gpt4 key购买 nike

我的一位客户在尝试使用我的产品时遇到异常。我得到了发生异常的callstack,最上面是:

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.__Error.WinIOError()
at System.IO.Path.GetTempFileName()
at System.Windows.Input.Cursor.LoadFromStream(Stream cursorStream)
at System.Windows.Input.Cursor..ctor(Stream cursorStream)

谷歌搜索,我发现了很多 blog posts说明当 %TEMP% 文件夹中的临时文件超过 65535 个时会抛出此异常,解决方案是简单地清除旧的临时文件。我可以要求客户这样做,但这可能只是一个临时解决方案 - 如果他们经常运行一些频繁调用 GetTempFileName 的其他软件,这会使问题反复出现怎么办?

我不能只是以编程方式清除 %TEMP% 文件夹,因为这可能会以某种方式损坏其他东西,而且我无法避免调用 GetTempFileName(并使用我自己的临时文件夹),因为不是我而是 WPF 代码调用它。

有什么永久性的解决方案吗?

更新:我已经确认 %TEMP% 文件夹中日志文件溢出的问题不是我自己的代码引起的,而一定是其他一些第三方应用程序引起的客户的机器。我还研究了 Cursor.LoadFromStream 的实现,它肯定没有错 - 它生成一个临时文件,但随后在 finally block 中将其删除。

最佳答案

如果您在生产环境或您无法更改的应用程序中发生这种情况,快速解决方法是清空 Temp 文件夹。

根据运行应用程序的用户,您应该

  • C:\Windows\Temp(用于在 LocalSystem 帐户下运行的 IIS 或服务)
  • 或用于本地登录用户的 %temp%(对我来说是 C:\Users\MyUserName\AppData\Local\Temp)。

另一方面,如果您自己的代码抛出此错误,并且您想防止这种情况再次发生:

  1. 不要使用 System.IO.Path.GetTempFileName()!

GetTempFileName()two decades old Win32 Api 的包装器.它生成的文件名很容易发生冲突。它通过在文件系统上大量循环、迭代从 "%temp%\tmp0000.tmp""tmpFFFF.tmp" 的可能文件名并跳过已经存在的文件来规避这些冲突那些。这是一种 I/O 密集型、缓慢且坦率地说非常糟糕的算法。仅使用 4 个十六进制字符也是人为限制失败前 65536 个文件的原因。

另一种方法是生成不会冲突的文件名。例如,让我们重用 GUID 的 逻辑:32 个十六进制数字几乎永远不会冲突。

private string GetTempFileName()
{
return Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
}
// Sample: c:\Windows\Temp\2e38fe87-f6bb-4b0d-90b3-2d07016324c1

这将限制从 65k 扩展到最大 4k 百万个文件(理论上)......当然,泄露 65k 文件已经很糟糕了,所以......

  1. 不要泄露临时文件!

仔细检查您的应用程序是否存在所有快乐和不快乐的路径(例如意外异常)。确保它正确处理每个 FileStream 并删除 Finally block 中的临时文件。

  1. 清理临时文件夹

现在清理它,并教育系统管理员定期清理它,因为你不能相信每个应用程序。在我自己的服务器上,我会使用以下方法自动执行此任务:

  • 对于全局 Windows\Temp

schtasks/Create/TR "cmd/c call DEL/F/S/Q %^TEMP%"/TN "删除全局临时文件"/sc WEEKLY/ST 12:00/ru system

  • 对于当前用户:

schtasks/Create/TR "cmd/c call DEL/F/S/Q %^TEMP%"/TN "Delete %username% Temp Files"/sc WEEKLY/ST 12:00

关于c# - System.IO.IOException : "The file exists" when using System. IO.Path.GetTempFileName() - 解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18350699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com