标准.NET Directory.CreateDirectory(字符串路径)方法创建一个目录(如果需要,包括父目录)(如果它们尚不存在),并为创建的目录返回一个DirectoryInfo对象。
如果目录已经存在,它将返回已经存在的目录的DirectoryInfo对象。
我需要一个创建目录的方法,如果它尚不存在,但会失败 - 如果目录已经存在则返回错误或抛出异常。
不,Directory.Exists(字符串路径)不会提供服务。我需要一些原子的东西。我正在与设计为存在或不存在某些目录作为锁的C ++应用程序接口,并且执行DirectoryExists()后跟Directory.CreateDirectory()会留下一个可以踩到的窗口。
在文件系统级别,创建目录是一种原子操作。如果两个进程都尝试它,那么只有一个进程会成功。 C ++程序可用的API反映了这一点。 .NET中的标准API隐藏了这一点。是否有一些可用的低级API?
答案 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);
}
如果因目录存在而失败,则函数返回false
,Marshal.GetLastWin32Error
应返回ERROR_ALREADY_EXISTS
(decimal 183 or 0xB7)。
ERROR_ALREADY_EXISTS 指定的目录已存在。
请注意 @stijn 的评论:
小警告:如果
CreateDirectory
指向现有文件,lpPathName
也会返回,因此可能错误地认为它是一个目录。