我正在制作一个软件,将文件从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);
}
答案 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等。