| File: System\IO\IsolatedStorage\Helper.NonMobile.cs | Web Access |
| Project: src\runtime\src\libraries\System.IO.IsolatedStorage\src\System.IO.IsolatedStorage.csproj (System.IO.IsolatedStorage) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Security; using System.Threading; namespace System.IO.IsolatedStorage { internal static partial class Helper { public const string IsolatedStorageDirectoryName = "IsolatedStorage"; internal static string GetDataDirectory(IsolatedStorageScope scope) { // This is the relevant special folder for the given scope plus IsolatedStorageDirectoryName. // It is meant to replicate the behavior of the VM ComIsolatedStorage::GetRootDir(). // (note that Silverlight used "CoreIsolatedStorage" for a directory name and did not support machine scope) Environment.SpecialFolder specialFolder = IsMachine(scope) ? Environment.SpecialFolder.CommonApplicationData : // e.g. C:\ProgramData IsRoaming(scope) ? Environment.SpecialFolder.ApplicationData : // e.g. C:\Users\Joe\AppData\Roaming Environment.SpecialFolder.LocalApplicationData; // e.g. C:\Users\Joe\AppData\Local string dataDirectory = Environment.GetFolderPath(specialFolder, Environment.SpecialFolderOption.Create); dataDirectory = Path.Combine(dataDirectory, IsolatedStorageDirectoryName); return dataDirectory; } internal static string GetRandomDirectory(string rootDirectory, IsolatedStorageScope scope) { string? randomDirectory = GetExistingRandomDirectory(rootDirectory); if (string.IsNullOrEmpty(randomDirectory)) { using (Mutex m = CreateMutexNotOwned(rootDirectory)) { if (!m.WaitOne()) { throw new IsolatedStorageException(SR.IsolatedStorage_Init); } try { randomDirectory = GetExistingRandomDirectory(rootDirectory); if (string.IsNullOrEmpty(randomDirectory)) { // Someone else hasn't created the directory before we took the lock randomDirectory = Path.Combine(rootDirectory, Path.GetRandomFileName(), Path.GetRandomFileName()); CreateDirectory(randomDirectory, scope); } } finally { m.ReleaseMutex(); } } } return randomDirectory; } private static Mutex CreateMutexNotOwned(string pathName) { return new Mutex(initiallyOwned: false, name: @"Global\" + IdentityHelper.GetStrongHashSuitableForObjectName(pathName)); } } }