2

我正在制作一个软件,它将文件从下载文件夹移动到目录中的特定子文件夹。用户通过组合框选择子文件夹。我不断收到此错误:System.IO.IOException: Cannot create a file when that file already exists.此外,这些错误出现在安装我的程序的人的计算机上......异常和事情。我怎么关掉它。另外,为什么我会收到此错误?这是我的代码:

        string pathUser4 = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
        string pathDownload4 = (pathUser4 + @"\Downloads\");
        string sourceFile = pathDownload4 + listBox1.Text;

        string pathdoc5 = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        string pathDownload5 = (pathdoc5 + @"\iracing\setups\");
        string destinationFile = pathDownload5 + comboBox1.Text;

        File.Move(sourceFile, destinationFile);
        if (comboBox1.Text == "Select File Destination")
        {
            MessageBox.Show("Please Select A Destination Folder", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        }
4

3 回答 3

4

每个 File.Move 都应该包装在一个 try/catch 块中,因为您永远不能期望 IO 操作执行时不会出错。它可能很简单,例如用户打开了文件句柄,或者目标文件夹中存在的文件,无论哪种方式,您都不希望单个文件引发停止整个操作的异常。您将希望捕获异常并将它们记录到错误日志文件或事件日志中,这样您就可以看到发生的错误,但不会中断任何事情。

其次,对于任何桌面应用程序,我会添加全局错误处理来记录任何未捕获的错误。您可以通过将此代码放在程序的开头来做到这一点,

AppDomain.CurrentDomain.UnhandledException += (a, exception) => File.AppendAllText("errorlog.txt", exception.ToString() + "\n"

这将使用户永远不会看到抛出丑陋的异常。还要确保您没有向用户提供 .pdb 文件,因为这将导致异常包含编译它的计算机的路径,其中可能包含您的用户名和您不希望客户端看到的其他敏感信息。


您可以在初始化主窗口时注册全局异常处理,您希望它是您在其他任何事情之前做的第一件事,因为您永远不知道何时会抛出异常,因此您必须进行防御性思考。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        AppDomain.CurrentDomain.UnhandledException += (a, exception) => File.AppendAllText("errorlog.txt", exception.ToString() + "\n");
        InitializeComponent();
    }
}

C# 广泛使用异常,因此如果您不熟悉这种类型的错误处理,这将是一个很好的学习概念。所有异常都派生自 Exception 类,因此当您编写 catch (Exception e) 时,它将捕获所有异常(因为基引用可以包含派生类型的对象),但是如果您知道某个方法将抛出的特定异常,您可以捕获一个更具体的异常(总是在更一般的捕获之前)并以特定的方式处理它。在此示例中,您可能有一个来自 File.Move() 的 IOException,您希望以不同的方式捕获和处理。

try 
{
    string pathUser4 = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
    string pathDownload4 = (pathUser4 + @"\Downloads\");
    string sourceFile = pathDownload4 + listBox1.Text;

    string pathdoc5 = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    string pathDownload5 = (pathdoc5 + @"\iracing\setups\");
    string destinationFile = pathDownload5 + comboBox1.Text;

    File.Move(sourceFile, destinationFile);
    if (comboBox1.Text == "Select File Destination")
    {
        MessageBox.Show("Please Select A Destination Folder", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    }
}
catch (Exception e)
{
    File.AppendAllText("ErrorLog.txt", e.ToString() + "\n");
}
于 2012-05-22T02:23:59.263 回答
0

该错误可能是由您的代码或某些无效输入引起的。

正如@Despertar 提到的,我建议所有程序都在您的代码中包含错误处理和日志功能。这对您的调试非常有帮助。
但我建议使用开源日志库,不要自己做。例如,log4net、NLog 等。

于 2012-05-22T02:44:19.533 回答
0

来自 MSDN 的 File.Move 示例代码应该让您指出需要处理的各种事情,例如已经存在的文件和基本错误处理。

using System;
using System.IO;

class Test 
{
    public static void Main() 
    {
        string path = @"c:\temp\MyTest.txt";
        string path2 = @"c:\temp2\MyTest.txt";
        try 
        {
            if (!File.Exists(path)) 
            {
                // This statement ensures that the file is created,
                // but the handle is not kept.
                using (FileStream fs = File.Create(path)) {}
            }

            // Ensure that the target does not exist.
            if (File.Exists(path2)) 
            File.Delete(path2);

            // Move the file.
            File.Move(path, path2);
            Console.WriteLine("{0} was moved to {1}.", path, path2);

            // See if the original exists now.
            if (File.Exists(path)) 
            {
                Console.WriteLine("The original file still exists, which is unexpected.");
            } 
            else 
            {
                Console.WriteLine("The original file no longer exists, which is expected.");
            }           

        } 
        catch (Exception e) 
        {
            Console.WriteLine("The process failed: {0}", e.ToString());
        }
    }
}
于 2012-05-22T02:37:20.087 回答