在 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);
}
每个 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等。