@Chris। मैं भी दूरस्थ जोखिम से ग्रस्त था कि एक अस्थायी निर्देशिका पहले से मौजूद हो सकती है। यादृच्छिक और क्रिप्टोग्राफिक रूप से मजबूत के बारे में चर्चा मुझे पूरी तरह से संतुष्ट नहीं करती है।
मेरा दृष्टिकोण मौलिक तथ्य पर निर्भर करता है कि ओ / एस को सफल होने के लिए फ़ाइल बनाने के लिए 2 कॉल की अनुमति नहीं देनी चाहिए। यह थोड़ा आश्चर्य की बात है कि .NET डिजाइनरों ने निर्देशिकाओं के लिए Win32 एपीआई कार्यक्षमता को छिपाने के लिए चुना, जो इसे बहुत आसान बनाता है, क्योंकि जब आप दूसरी बार निर्देशिका बनाने का प्रयास करते हैं तो यह एक त्रुटि देता है। यहाँ मेरा उपयोग है:
[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;
}
आपको यह तय करना होगा कि मानवरहित पी / चालान कोड की "लागत / जोखिम" इसके लायक है या नहीं। ज्यादातर कहेंगे कि यह नहीं है, लेकिन कम से कम अब आपके पास एक विकल्प है।
CreateParentFolder () को छात्र को एक अभ्यास के रूप में छोड़ दिया जाता है। मैं Directory.CreateDirectory () का उपयोग करता हूं। एक मूल के माता-पिता को प्राप्त करने से सावधान रहें, क्योंकि यह जड़ में होने पर अशक्त है।