如何在不使用try-catch的情况下检查路径是否有效?

时间:2012-12-18 12:59:40

标签: c# exception-handling path directory

我想检查文件夹是否存在,如果不存在则创建它。但我不知道提供的路径是否有效。当路径无效时,会发生以下情况。

string path = "this is an invalid path";

if (!Directory.Exists(path))
    Directory.CreateDirectory(path); //Exception thrown here

如果您提供的路径无效,则会引发DirectoryNotFoundException例外。

如何阻止此异常发生?我不想使用try-catch。我想检测即使在异常发生之前也会发生此异常。

7 个答案:

答案 0 :(得分:9)

使用Directory.Exists方法检查文件夹是否存在

if(Directory.Exists(path))
{
  //Directory exists
}
else
{
 // doesn't exist
}

请记住加入System.IO;

答案 1 :(得分:8)

代码失败的解释是路径无效。文档说:

  

<强> DirectoryNotFoundException

     

指定的路径无效(例如,它位于   未映射的驱动器。)

提前预测是否可以创建目录是一项工作的魔鬼。您需要考虑安全性,操作系统名称规则和限制,文件系统名称规则和限制以及是否映射驱动器。可能还有更多的担忧。我不打算重新实现系统免费提供的功能。

在任何情况下,虽然您可以调用Directory.Exists,但您仍然需要允许抛出异常。如果文件系统在调用Directory.Exists和后续调用Directory.CreateDirectory之间发生更改,则会引发异常。例如,如果另一个进程创建了您尝试创建的目录。当然,这是一个不太可能的事件,但它完全有可能。

总之,远距离的最佳选择是捕捉异常。众所周知的说法是,要求宽恕比要求许可更好。

答案 2 :(得分:3)

为什么不想捕获(特定)例外情况?这被认为是一种很好的做法......无论如何,这些都是我没有尝试/捕获的解决方案:

  1. 溶液:

    string path = "C:\test";
    if (!Directory.Exists(path) && path.IndexOfAny(Path.GetInvalidFileNameChars()) == -1)
    {
        Directory.CreateDirectory(path);
    }
    
  2. 溶液:

    string path = "C:\test";
    var canCreate = true;
    foreach (var c in path.Where(Path.GetInvalidFileNameChars().Contains))
    {
        canCreate = false;
    }
    
    if (canCreate && !Directory.Exists(path))
    {
        Directory.CreateDirectory(path);
    }
    
  3. 溶液:

    if (path.Any(c => Path.GetInvalidFileNameChars().Contains(c)) && !Directory.Exists(path))
    {
        Directory.CreateDirectory(path);
    }
    
  4. 请注意,此代码仍可能失败...例如想想SecurityExeption(你有没有在那里创建一个目录???

    还要注意,在使用Exists()进行测试之后但在调用CreateDirectory()之前,仍然有(很少)机会创建目录(由另一个进程/线程/ ...)。这些是两个调用,在查询/修改文件系统时它们不是原子的(一起)。

答案 3 :(得分:0)

您还可以使用Path.GetInvalidFileNameChars()检查提供的目录名是否对 new 目录名有效:

// Directory.Exists will return false because path is not even valid
var path = "1:1 comparison?";
var firstBad = Path.GetInvalidFileNameChars().Cast<char?>()
                   .FirstOrDefault(c => path.Contains(c.Value));
if (firstBad != null)
    Console.WriteLine("Char '{0}' is invalid for a directory name", firstBad.Value);

答案 4 :(得分:0)

试试这个

string path =“这是一条无效路径”;

        if (Path.IsPathRooted(path)
        {
            Directory.CreateDirectory(path); 
        }

答案 5 :(得分:0)

我认为测试路径是否有效以及文件是否存在而不在C#中引发异常的最简单方法是直接在shlwapi.dll中调用非托管函数PathFileExists

[DllImport("shlwapi.dll", EntryPoint = "PathFileExistsW",  SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool PathFileExists([MarshalAs(UnmanagedType.LPTStr)]string pszPath);

请注意,正如David在his answer中写的那样,当您尝试创建目录时,您可能会遇到异常。

答案 6 :(得分:-1)

您可以使用单个if-else语句

if(!Directory.Exists(path))
   Directory.CreateDirectory(path)
else
   //Show user a custom error message