我的一位客户每次try 使用我的产品时都会遇到一个例外.我获得了发生的异常的调用堆栈,其顶部是:

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代码.

有什么永久的解决办法吗?

UPDATE:我已确认%TEMP%文件夹中日志(log)文件溢出的问题不是由我自己的代码引起的,必须是由客户机器上的其他第三方应用程序引起的.我还研究了Cursor.LoadFromStream的实现,它肯定没有错——它生成了一个临时文件,但在finally块中删除了它.

推荐答案

正如我在上一篇 comments 中提到的,我认为唯一安全的方法是询问用户是否希望您删除文件并重试.这是imperative,你让用户输入到这个,这种方式是在他们自己的风险.在我的脑海里,这与.

public Stream GetStream(Stream cursorStream)
{
    try
    {
       //getting stream
    }
    catch(IOE)
    {
        MessageBox.Show(this, "Unable to get stream, your temporary
                              folder may be full, do you want to try deleting 
                                some and try again?");
         if(yes)
         try
         {
             //delete and try again
             return GetStream(cursorStream);
         }
         catch(IOE)
          {
                //no luck
           }
          else
              return null;
    }

}

一个可选的判断,以确保,

Directory.EnumerateFiles(Path.GetTempPath(), "*", SearchOption.TopLevelOnly)
  .Count() == ushort.MaxValue;

.net相关问答推荐

CLR如何在后台优化布尔比较操作?

.NET MAUI 的登录页面

为什么 .NET 中的 System.Version 定义为 Major.Minor.Build.Revision?

标签从右向左增长

C#6.0 字符串插值本地化

log4net 与 TraceSource

在 .NET C# 中存储加密密钥的最佳方式

如何在 C# 4.0 中使任务进入睡眠状态(或延迟)?

String 是原始类型吗?

Java 和 .NET 技术/框架的类似物

如何在可取消的异步/等待中处理 TransactionScope?

没有 @Html.Button !

ASP.NET Core (.NET Core) 和 ASP.NET Core (.NET Framework) 的区别

为什么会出现编译错误使用未分配的局部变量?

何时何地使用 GetType() 或 typeof()?

找不到库 hostpolicy.dll

如何从文件中删除单个属性(例如只读)?

如何在 nuspec 中指定特定的依赖版本?

C# - 在 WPF 应用程序中保存用户设置的方法?

序列化和反序列化 .NET 对象的最快方法