使用Try/Catch检查文件是否存在

3

我对Try/Catch还不熟悉。在下面的代码中,我有一个简单的测试来检查文件是否存在。在我的C#课程任务中,我必须使用Try/Catch,但我不确定如何使用它,我应该在Try部分仍然使用if语句来检查文件是否存在,还是有更好的方法来在Try中检查文件是否存在?如果文件只是一个简单的文本文件或序列化文件,是否有区别?

if (File.Exists("TextFile1.txt"))
{
   MessageBox.Show("The file don't exist!", "Problems!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}

我必须使用Try/Catch方式
try
{
code to check if file exist here
}
catch
{
error message here
}

1
File.Exists不会抛出任何异常,所以我认为在那里真的没有必要使用try-catch。您可以使用一些更好的示例来说明try-catch的用法。 - AksharRoop
你可能想检查文件是否丢失,然后显示消息框。也许尝试使用 if (!File.Exists)。 - Greg
1
如果可能的话,尽量避免使用try-catch,除非你预期会出现异常,并且知道如何处理它,或者你想捕获任何异常以记录日志并防止它导致应用程序崩溃。 - Steen Tøttrup
其实应该是“文件不存在”,但是如果将此作为消息框显示给用户,最好不要使用缩写。因此更好的说法是:“文件不存在”。顺便说一句,没有冒犯之意。 - Silvermind
一个try catch语句比一个IF语句昂贵数百倍。 - Brain2000
7个回答

11
try
{
 if (!File.Exists("TextFile1.txt"))
    throw new FileNotFoundException();
}
catch(FileNotFoundException e)
{
   // your message here.
}

我知道这就是 OP 要求的,但应该加上一条免责声明,说明为什么这是一个可怕的想法和反模式。 - CervEd

7
试试这个:
try
{
   if(!File.Exist("FilePath"))
       throw new FileNotFoundException();

   //The reste of the code
}
catch (FileNotFoundException)
{
    MessageBox.Show("The file is not found in the specified location");
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

2
捕捉特定异常.. :D - AksharRoop

6
如果你想检查文件是否存在,而不使用File.Exist方法,你可以在try块中尝试打开该文件,然后捕获FileNotFoundException异常。
try
{
    // Read in non-existent file.
    using (StreamReader reader = new StreamReader("TextFile1.txt"))
    {
    reader.Read();
    }
}
catch (FileNotFoundException ex)
{
    MessageBox.Show("The file don't exist!", "Problems!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    // Write error.
    Console.WriteLine(ex);
}

谢谢您的回答!当我尝试您的代码时,Streamreader 下面会出现一条红线,我猜这里必须有更多的代码来声明它! - 3D-kreativ
只需右键单击它并单击“解决”,或在顶部包括 using System.IO; - Habib
我正在使用字符串file = openFileDialog1.FileName; 当我使用“file”时,我得到了整个路径,有没有办法只获取文件名? - 3D-kreativ
使用 var onlyFileName = System.IO.Path.GetFileName(openFileDialog1.FileName); - Habib
嗯,当我使用你的最后一段代码并使用“文件”时,我收到了一个文件不存在的消息,但那不是我的问题!而且当我使用你的最后一段代码时,已经存在的文件会捕获我的错误消息!? - 3D-kreativ
将整个文件读入内存仅为了检查其是否存在,对我来说似乎不是一个好主意。 - CervEd

2

使用throw关键字:

try
{
    if (!File.Exists("TextFile1.txt"))
        throw (new Exception("The file don't exist!"));
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

你的逻辑与你的异常陈述完全相反。 - Gabriel Graves
1
你忘记加上感叹号 ! 了。 - Silvermind

2

你已经在第一个片段中检查了文件是否存在。对于try/catch块内的代码,没有任何需要。


好的,如果他们想在检查后使用文件,仍然存在竞争条件;-) - Joey
好的,但是在打开和保存文件时,我必须使用Try/Catch或Using来完成我的任务。我猜老师希望我们处理文件不存在或用户没有写入权限的情况。 - 3D-kreativ
@3D-kreativ:在这个代码中,您已经检查了存在性。也许您的老师的意思是:如果您想象一下,您正在向USB驱动器上的文件写入数据。一个大文件。在写入过程中,您从PC中拔出USB。这意味着在写操作的中途,文件不再可用(它不存在了),您必须处理这些问题。如果您只想检查文件是否存在,请使用File.Exists(..),但如果您要在文件中写入内容,请按照我之前写的理由使用try/catch。 - Tigran

0

只有在出现意外错误或者你“预计”会出现访问资源的错误时,才需要使用try/catch。这听起来有点混乱,但在你的情况下,两种情况都不是。

然而,如果你打开一个流来读取文件,而没有检查它是否存在,那么就需要使用try..catch。

总的来说,try..catch应该用于安全性和代码复杂性/长度较高的情况下。


0

关于这个问题,以下的讨论串可能会有所帮助

http://social.msdn.microsoft.com/Forums/en-NZ/winappswithcsharp/thread/1eb71a80-c59c-4146-aeb6-fefd69f4b4bb

File.Exists API在Windows 8中发生了改变,其解释如下:

目前检查文件是否存在的唯一方法是捕获FileNotFoundException异常。正如已经指出的,显式检查和打开之间存在竞争条件,因此我不希望添加任何文件存在API。我相信文件IO团队(我不在那个团队中因此我不确定,但这是我听到的)正在考虑将此API在文件不存在时返回null而不是抛出异常。

使用File.Exists的方法不是线程安全的,并且在Windows 8的API中已被删除。因此只需捕获FileNotFoundException异常即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接