在 C# 中移动文件时遇到问题

本文关键字:遇到 问题 文件 移动 | 更新日期: 2023-09-27 18:34:57

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

在 C# 中移动文件时遇到问题

每个 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(异常 e(时,这将捕获所有异常(因为基引用可以保存派生类型的对象(,但是如果您知道方法将抛出的特定异常,则可以捕获更具体的异常(总是在更一般的 catch 之前(并以特定方式处理它。在此示例中,您可能有一个来自 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");
}

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

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

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