- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我的一位客户在尝试使用我的产品时遇到异常。我得到了发生异常的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
)。另一方面,如果您自己的代码抛出此错误,并且您想防止这种情况再次发生:
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 文件已经很糟糕了,所以......
仔细检查您的应用程序是否存在所有快乐和不快乐的路径(例如意外异常)。确保它正确处理每个 FileStream 并删除 Finally block 中的临时文件。
现在清理它,并教育系统管理员定期清理它,因为你不能相信每个应用程序。在我自己的服务器上,我会使用以下方法自动执行此任务:
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/
我不确定我是否是第一个注意到这一点的人,但是(哈哈,这有点有趣......)每当我打电话时(我调试应用程序来验证这一点)GetTempFileName(来自 Windows .pas 单元),它在我的
我正在使用 GetTempFileName() 将字节从数据库写入临时文件。这些文件通常是 PDF 类型,但是,它们可以而且确实会有所不同。 我遇到了一个问题,尝试 Process.Start(tem
我正在创建一个临时文件并使用以下代码获取其路径: public ActionResult Comp(string Link) { var sv = Server.Map
使用 VS2008,c#。 当我调用 Path.GetTempFileName() 时,生成的临时文件类似于:C:\Users\allensamuel\AppData\Local\Temp\tmpC1
我们的应用程序从外部设备收集数据。此数据主要驻留在内存中,但在用户明确保存数据之前会以临时文件的形式假脱机到磁盘。这是为了在应用程序由于某种原因崩溃时提供一些恢复机会。一般来说,它工作得很好。 最近我
.NET Framework 定义了一个System.IO.Path.GetTempFileName 方法,该方法保证它生成的临时文件名是唯一的。据我所知,尽管极不可能,但此文件名可能 与同一路径中的
我需要获取临时文件以查看发生了什么,因为实际文件永远不会输出。但是,我似乎找不到创建临时文件的位置。 我需要在不编写代码或构建应用程序的情况下找到它,因为到处都是分散的依赖项。我将无法部署调试版本。
我们在一台计算机上运行程序 (c#) 的多个实例。在每个实例中,我们的代码都试图在方法 Path.GetTempFile() 的帮助下创建“许多”临时文件。有时,我们的程序会因异常而失败: Excep
在使用Path.GetTempFileName时,在某些服务器上遇到目录名称无效的错误。进一步的调查表明,它正在尝试将文件写入c:\Documents and Setting\computername
我一直认为答案是肯定的,但现在我正在努力寻找真相。 当我使用 Path.GetTempFileName() 创建临时文件时, 以后 window 会自动清理吗? 如果我在Path.GetTempPat
我需要使用 c++ (WINRT/Metro) 在我的应用程序中生成唯一的临时文件名。如我所见,Win32 API GetTempFileName标记为仅在桌面上使用。 Metro 风格应用程序的等价
我想使用 GetTempFileName函数生成随机文件名,但在调用函数时不创建文件本身。我想使用该函数来使用名称本身(不带扩展名),以便稍后我可以创建一个具有该特定名称的文件夹。由于没有创建文件夹的
我有一个使用 GetTempFileName 的 MFC 程序。在 Windows 7 上它可以正常工作,但是当我将相同的代码带到 Windows 10 上时它会产生垃圾。 TCHAR temp_di
基于 https://msdn.microsoft.com/en-us/library/system.io.path.getrandomfilename(v=vs.110).aspx 的推荐我已将 G
TPath.GetTempFileName(包含 WinAPI GetTempFileName)在从登录到域的用户运行的应用程序调用时回复“目录名称无效” . 如果他们使用未使用域的登录名,则可以。
我的一位客户在尝试使用我的产品时遇到异常。我得到了发生异常的callstack,最上面是: at System.IO.__Error.WinIOError(Int32 errorCode, Strin
我是一名优秀的程序员,十分优秀!