我需要检查目录/文件是否存在吗?

4

Which one code is better?

Code1:

if (!Directory.Exists("DirectoryPathHere"))
    Directory.CreateDirectory("DirectoryPathHere");

代码2:

Directory.CreateDirectory("DirectoryPathHere");

我认为应该选择Code2,因为我看到它不会产生任何错误,并且在文件夹已经存在时不会创建新的文件夹,所以我认为检查文件夹是否存在是无用的。对吗?


2
你遇到这样的问题时,首先可以去MSDN寻求帮助。在这种情况下,只需要花两秒钟时间在谷歌上搜索Directory.CreateDirectory,就能找到正确的答案。 - paddy
@paddy我已经知道MSDN上说的了(我自己弄明白了),但人们仍然会检查文件夹是否存在,所以我想知道为什么? - biox
1
虽然这样的防御性编程从来都不是一个坏主意。所以我个人会选择版本1。 - Simon Whitehead
是的,Code2 也是正确的。CreateDirectory 函数本身会检查目录是否存在,如果不存在则会创建。我也同意 @SimonWhitehead 的观点。 - Vijay Hulmani
有时候你想警告用户这个文件夹已经存在,以免他们错误地覆盖了当前的文件夹,这可能是一个原因,另一个原因是有些人对错误过于执着,所以他们会在任何地方进行不必要的检查 :)(我也是一名心理学家) - Ehsan88
5个回答

5
您无需检查目录是否已经存在,该方法会为您检查。如果您查看MSDN

除非路径中的某些部分无效或目录已经存在,否则将创建路径中指定的任何和所有目录。路径参数指定目录路径,而不是文件路径。如果目录已经存在,则此方法不会创建新目录,但它会返回现有目录的DirectoryInfo对象。


2
我会使用DirectoryInfo类,检查它是否存在,并且如果它存在,则也要检查目录的权限,以防我的当前运行时权限不足以访问目录内容或更新目录。无论您选择哪种方法,都应该应用异常处理;例如,如果存在一个与目录名称相同的文件,会发生什么?

1
关键是 CreateDirectory 方法在尝试创建目录之前隐式检查目录是否存在。
为了提高代码可读性,最好先使用显式方法 Directory.Exists
我也强烈赞同 @SimonWhitehead 的防御性编程观点。表明你意识到陷阱...并在代码中明确地进行积极防御是一件好事 :)
I think we can all see the fact that the second method does the same, 
but, is it cheaper in terms of being more readable? No.

了解该框架的任何人可能会持不同意见,我也可以。但是:

永远编写代码,就好像最终维护您的代码的人是一个知道您住在哪里的暴力精神病患者。

http://www.codinghorror.com/blog/2008/06/coding-for-violent-psychopaths.html

编辑2: 我有一种奇怪的感觉,编译器会这样做。汇编程序员在生成IL之前就能检测到它。

1
我不认为添加这个检查是防御性编程,因为它不可能在任何情况下起到作用。为什么不更加谨慎,再添加一些多余的检查呢?if (!Directory.Exists("DirectoryPathHere") && !Directory.Exists("DirectoryPathHere") && !Directory.Exists("DirectoryPathHere")) { - Blorgbeard
我确实同意这样做可以使代码更清晰,但我认为加上注释就足够了。 - Blorgbeard
@Blorgbeard 我使用TFS,很少使用注释,因为所有任务都与变更集相关联。明确的代码可读性和维护是我的主要关注点。对于这个诱人的问题,我点赞了。 - Jeremy Thompson

0

这里有一个简单的代码来自http://msdn.microsoft.com/en-us/library/54a0at6s.aspx

using System;
using System.IO;

class Test 
{
    public static void Main() 
    {
        // Specify the directory you want to manipulate. 
        string path = @"c:\MyDir";

        try 
        {
            // Determine whether the directory exists. 
            if (Directory.Exists(path)) 
            {
                Console.WriteLine("That path exists already.");
                return;
            }

            // Try to create the directory.
            DirectoryInfo di = Directory.CreateDirectory(path);
            Console.WriteLine("The directory was created successfully at {0}.", Directory.GetCreationTime(path));

            // Delete the directory.
            di.Delete();
            Console.WriteLine("The directory was deleted successfully.");
        } 
        catch (Exception e) 
        {
            Console.WriteLine("The process failed: {0}", e.ToString());
        } 
        finally {}
    }
}

0

虽然您不必检查它,但由于处理文件和文件夹时可能出现许多问题,最好包括try-catch语句以处理任何潜在问题:

try {
   Directory.CreateDirectory("DirectoryPathHere");
}
catch (Exception ex)
{
   MessageBox.Show("Error: "+ex.Message);
}

如果需要的话,您也可以添加 finally


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