无法在C#中移动文件?

时间:2012-05-22 02:16:57

标签: c# file-io visual-c#-express-2010

我正在制作一个软件,将文件从downloads文件夹移动到目录中的特定子文件夹。用户通过组合框选择子文件夹。我一直收到这个错误: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); 
        }

3 个答案:

答案 0 :(得分:4)

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

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

来完成此操作
AppDomain.CurrentDomain.UnhandledException += (a, exception) => File.AppendAllText("errorlog.txt", exception.ToString() + "\n"

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


你可以在主窗口初始化时注册全局异常处理,你希望它在你做任何其他事情之前是你做的第一件事,因为你再也不知道什么时候会抛出异常所以你必须在防御性思考。< / p>

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");
}

答案 1 :(得分:0)

The example code from MSDN for 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());
        }
    }
}

答案 2 :(得分:0)

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

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