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

Jef*_*ege 4 .net c# directory

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

如果该目录已存在,则返回已存在的目录的DirectoryInfo对象.

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

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

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

Ale*_*exD 6

考虑通过Interop使用本机CreateDirectory:

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);
}
Run Code Online (Sandbox Code Playgroud)

如果由于目录存在而失败,则函数返回falseMarshal.GetLastWin32Error应返回ERROR_ALREADY_EXISTS (十进制183或0xB7).

ERROR_ALREADY_EXISTS指定的目录已存在.

请注意@stijn的话:

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