【问题标题】:System.IO.File.Delete throws Arithmetic operation resulted in an overflowSystem.IO.File.Delete throws 算术运算导致溢出
【发布时间】:2014-11-17 00:45:36
【问题描述】:

我有这个奇怪的错误。当我调用System.IO.File.Delete() 时,它会抛出

JobCleaner.CleanFiles():无法删除文件:D:\WorkerData\4\Run128\Run_TEMPLATE_Rail_Scenario_Type35_INFHD2_NO_TAX_NOMEP\out‌​put_panels\FileIndex55.bin

错误:算术运算导致溢出。

没有堆栈跟踪。

这是我的代码:

foreach (string strFile in System.IO.Directory.GetFiles(strFolder))
{
    try { System.IO.File.Delete(strFile); }
    catch (Exception ex)
    {
        //Exception here
        AddToLog("JobCleaner.CleanFiles(): Error occurred when trying to delete file \"" + strFile + "\".\nError:\n" + ex.Message);
        return false;
    }
}

有什么想法吗?我尝试了一切,我检查了文件夹的安全性。我用完全控制启用了“所有人”,但仍然遇到这个“算术运算导致溢出”异常。

有人可以帮忙吗?我正在使用 Windows 2012 R2 Datacenter 来运行我的应用程序。

【问题讨论】:

  • File.Delete() 不能直接抛出这个异常,所以是其他原因造成的,我认为删除实际上不起作用?
  • 是的,这很奇怪。 File.Delete() 没有理由做任何算术运算,更别提抛出与一个相关的异常了。奇怪的是,您没有发布一个好的问题这一事实特别令人烦恼。您至少应该发布完整的错误信息,包括堆栈跟踪。实际上,您应该创建一个更好、完整、简洁的代码示例。见stackoverflow.com/help/mcve
  • 是的,这很奇怪。这是唯一引发异常的代码行。除了 System.IO.File.Delete() 之外没有其他代码......我正在撕扯我的头发:(
  • 彼得,那是我从日志文件中得到的。这是完整的错误(没有堆栈错误): JobCleaner.CleanFiles(): Unable to delete file: D:\WorkerData\4\Run128\Run_TEMPLATE_Rail_Scenario_Type35_INFHD2_NO_TAX_NOMEP\output_panels\FileIndex55.bin 错误:算术运算导致溢出。好的,我将尝试修改我的代码以输出堆栈跟踪。对此感到抱歉... PS。它适用于 Windows 7 和 Windows 2008。它只是不适用于 Windows 2012 R2 Datacenter
  • 记录整个异常,包括堆栈跟踪。所以不要使用ex.Message,而是使用ex.ToString()。堆栈跟踪应该准确地告诉您错误发生在哪一行。

标签: c# .net c#-4.0 delete-file


【解决方案1】:

我不希望它抛出一个算术异常,但是当你在 foreach 中修改一个 IEnumerable 时,我观察到一些奇怪的行为。尝试将文件列表移出循环,如下所示:

string[] files = System.IO.Directory.GetFiles(strFolder);
foreach (string strFile in files)
{
  try { System.IO.File.Delete(strFile); }
  catch (Exception ex)
  {
    //Exception here
    AddToLog("JobCleaner.CleanFiles(): Error occurred when trying to delete file \"" + strFile + "\".\nError:\n" + ex.Message);
    return false;
  }
}

【讨论】:

  • 将呼叫转移到 GetFiles 不会有任何区别。它编译为与原始代码相同的代码。
  • 在修改我的代码以输出异常(通过使用 ex.ToString())时,我将 GetFiles() 移出 foreach...loop。现在它起作用了!我,然后把它移回原来的位置,它仍然有效。我不知道发生了什么。我会在其他机器上试试。
猜你喜欢
  • 1970-01-01
  • 2011-05-15
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多