创建目录,但如果已存在则失败

时间:2014-08-14 15:41:13

标签: c# .net directory

标准.NET Directory.CreateDirectory(字符串路径)方法创建一个目录(如果需要,包括父目录)(如果它们尚不存在),并为创建的目录返回一个DirectoryInfo对象。

如果目录已经存在,它将返回已经存在的目录的DirectoryInfo对象。

我需要一个创建目录的方法,如果它尚不存在,但会失败 - 如果目录已经存在则返回错误或抛出异常。

不,Directory.Exists(字符串路径)不会提供服务。我需要一些原子的东西。我正在与设计为存在或不存在某些目录作为锁的C ++应用程序接口,并且执行DirectoryExists()后跟Directory.CreateDirectory()会留下一个可以踩到的窗口。

在文件系统级别,创建目录是一种原子操作。如果两个进程都尝试它,那么只有一个进程会成功。 C ++程序可用的API反映了这一点。 .NET中的标准API隐藏了这一点。是否有一些可用的低级API?

1 个答案:

答案 0 :(得分:6)

考虑通过CreateDirectory使用原生Interop

internal static class NativeMethods
{
    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool CreateDirectory(string lpPathName, IntPtr lpSecurityAttributes);
}

如果因目录存在而失败,则函数返回falseMarshal.GetLastWin32Error应返回ERROR_ALREADY_EXISTS (decimal 183 or 0xB7)

  

ERROR_ALREADY_EXISTS 指定的目录已存在。

请注意 @stijn 的评论:

  

小警告:如果CreateDirectory指向现有文件,lpPathName也会返回,因此可能错误地认为它是一个目录。