我想检查文件夹是否存在,如果不存在则创建它。但我不知道提供的路径是否有效。当路径无效时,会发生以下情况。
string path = "this is an invalid path";
if (!Directory.Exists(path))
Directory.CreateDirectory(path); //Exception thrown here
如果您提供的路径无效,则会引发DirectoryNotFoundException
例外。
如何阻止此异常发生?我不想使用try-catch。我想检测即使在异常发生之前也会发生此异常。
答案 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)
为什么不想捕获(特定)例外情况?这被认为是一种很好的做法......无论如何,这些都是我没有尝试/捕获的解决方案:
溶液:
string path = "C:\test";
if (!Directory.Exists(path) && path.IndexOfAny(Path.GetInvalidFileNameChars()) == -1)
{
Directory.CreateDirectory(path);
}
溶液:
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);
}
溶液:
if (path.Any(c => Path.GetInvalidFileNameChars().Contains(c)) && !Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
请注意,此代码仍可能失败...例如想想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