@Chris. Ben de geçici bir dizinin halihazırda mevcut olma riskine kafayı takmıştım. Rastgele ve kriptografik açıdan güçlü tartışmalar da beni tamamen tatmin etmiyor.
Benim yaklaşımım, O / S'nin 2 çağrının her ikisinin de başarılı olması için bir dosya oluşturmasına izin vermemesi gerektiği gerçeğine dayanıyor. NET tasarımcılarının dizinler için Win32 API işlevini gizlemeyi seçmeleri biraz şaşırtıcıdır, bu da bunu çok daha kolaylaştırır, çünkü ikinci kez bir dizin oluşturmaya çalıştığınızda bir hata döndürür. İşte kullandığım şey:
[DllImport(@"kernel32.dll", EntryPoint = "CreateDirectory", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool CreateDirectoryApi
([MarshalAs(UnmanagedType.LPTStr)] string lpPathName, IntPtr lpSecurityAttributes);
/// <summary>
/// Creates the directory if it does not exist.
/// </summary>
/// <param name="directoryPath">The directory path.</param>
/// <returns>Returns false if directory already exists. Exceptions for any other errors</returns>
/// <exception cref="System.ComponentModel.Win32Exception"></exception>
internal static bool CreateDirectoryIfItDoesNotExist([NotNull] string directoryPath)
{
if (directoryPath == null) throw new ArgumentNullException("directoryPath");
// First ensure parent exists, since the WIN Api does not
CreateParentFolder(directoryPath);
if (!CreateDirectoryApi(directoryPath, lpSecurityAttributes: IntPtr.Zero))
{
Win32Exception lastException = new Win32Exception();
const int ERROR_ALREADY_EXISTS = 183;
if (lastException.NativeErrorCode == ERROR_ALREADY_EXISTS) return false;
throw new System.IO.IOException(
"An exception occurred while creating directory'" + directoryPath + "'".NewLine() + lastException);
}
return true;
}
Yönetilmeyen p / invoke kodunun "maliyetinin / riskinin" buna değip değmeyeceğine siz karar verirsiniz. Çoğu kişi öyle olmadığını söyler, ama en azından şimdi bir seçeneğiniz var.
CreateParentFolder () öğrenciye alıştırma olarak bırakılır. Directory.CreateDirectory () kullanıyorum. Kökteyken boş olduğu için bir dizinin üstünü alırken dikkatli olun.