【问题标题】:Strange Problem with File.Move commandFile.Move 命令的奇怪问题
【发布时间】:2011-08-17 10:03:35
【问题描述】:

我在使用 File.Move 命令时遇到了一个奇怪的问题。程序实际上移动并重命名了文件,但随后向我抛出了找不到源文件的异常; - 文件被移动后的预期结果。

如果我捕捉到异常,程序可以正常工作,但我想知道为什么会得到这些异常。

我的代码:

  foreach (string str in CPM.prot.FKFinishedBad) 
  {   
        try  
        {  
          string dir = System.Configuration.ConfigurationSettings.AppSettings["ResultDir"] + "\\" + DateTime.Now.ToString("yyyy_MM_dd") + "_Bearbeitete Protokolle";  
        if (!Directory.Exists(dir))  
        {  
          Directory.CreateDirectory(dir);  
        }  
          File.Move(System.Configuration.ConfigurationSettings.AppSettings["ResultDir"] + "\\" +  str + "_" + CPM.LastJob + ".txt", dir + "\\" + "\\" + str + "_" + CPM.LastJob + "_Nachproduziert" + ".txt");  
        }  
        catch (Exception e)  
        {  
        }  
    }  

【问题讨论】:

  • FKFinishedBad中是否有重复项?
  • 另外,请确保您没有打开资源管理器来观看您正在移动的文件。我曾经花了一整天的时间来追逐一个像这样的智障异常

标签: c# .net


【解决方案1】:

确保 CPM.prot.FKFinishedBad 中的每个项目都是唯一的 - 这可能是导致该现象的原因。

另外,我建议重构代码:目录行不需要重复,应该在循环之外。

请学习使用 String.Format 和 Path.Combine。

【讨论】:

  • 不是每个文件都是唯一且存在的。正如我试图解释的那样,文件的移动工作正常,但在那之后我得到了异常,因为不再存在源文件,因为它被移动了,这是显而易见的,至少这是我对问题的理解。
【解决方案2】:

您确定所有文件都存在吗? 其中一个可能会丢失(这解释了异常),而其他的则被正确处理。您还可以在移动之前使用 File.Exists 进行检查。

另外,使用空的 catch 块时要小心,它们在调试时会引起很多麻烦。

【讨论】:

  • 同意,最好的方法是在执行 File.Move 之前始终使用 File.Exists,这将确保它不会抛出任何异常。
  • 我真的不明白,但它是解决方案。但是所有文件之前都已经存在,所以如果有人能解释一下,我将非常感激。顺便说一句,我很确定这些文件以前存在,因为我让用户选择是否应该删除文件或移动文件并使用完全相同的名称删除文件可以正常工作
【解决方案3】:

尝试在这里暂停线程半秒(或更短):

if (!Directory.Exists(dir))  
{  
  Directory.CreateDirectory(dir);  
  //suspend thread for 0.5 sec
}  

这可能与您创建目录并立即移动文件有关。所以暂停一个线程让系统“呼吸”。

【讨论】:

  • 试过了,这不是原因,但感谢您的快速答复
【解决方案4】:

我刚刚遇到这个问题,我花了一段时间才意识到有一个FileInfo.MoveTo 命令似乎在做同样的事情。

但是它不会抛出异常,并且可以正常工作。

如果有两种方法可以做一件事,而只有其中一种有效,那就有点狡猾了。

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2015-06-21
    • 2011-11-14
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多