3

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

string path = "this is an invalid path";

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

如果您提供无效路径,它将引发DirectoryNotFoundException异常。

如何阻止此异常的发生?我不想使用try-catch。我想在异常发生之前检测到这个异常是否会发生。

4

7 回答 7

9

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

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

记得包括System.IO;

于 2012-12-18T13:00:40.137 回答
8

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

DirectoryNotFoundException

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

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

无论如何,虽然您可以调用Directory.Exists,但您仍然需要允许抛出异常。如果文件系统在对 的调用Directory.Exists和随后的对 的调用之间发生变化Directory.CreateDirectory,则会引发异常。例如,如果另一个进程创建了您尝试创建的目录。诚然,这是一个不太可能发生的事件,但完全有可能。

总而言之,最好的选择是捕捉异常。俗话说,请求宽恕不如请求许可。

于 2012-12-18T13:02:12.053 回答
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);
    }
    

请注意,此代码仍然可能失败...例如考虑 SecurityExeption (您是否有凭证在那里创建目录?!?

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

于 2012-12-18T14:24:21.557 回答
0

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

// 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);
于 2012-12-18T13:15:53.530 回答
0

试试这个

string path = "这是一个无效的路径";

        if (Path.IsPathRooted(path)
        {
            Directory.CreateDirectory(path); 
        }
于 2012-12-19T06:31:27.670 回答
0

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

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

请注意,正如大卫在他的回答中所写,当您尝试创建目录时,您可能仍然会遇到异常。

于 2017-01-10T09:24:58.177 回答
-1

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

if(!Directory.Exists(path))
   Directory.CreateDirectory(path)
else
   //Show user a custom error message
于 2012-12-18T13:03:33.873 回答