Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / fx / src / CompMod / System / CodeDOM / Compiler / TempFiles.cs / 1 / TempFiles.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.CodeDom.Compiler { using System; using System.Collections; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; using System.Text; using Microsoft.Win32; using System.Security; using System.Security.Permissions; using System.Security.Principal; using System.ComponentModel; using System.Security.Cryptography; using System.Globalization; using System.Runtime.Versioning; ////// [PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")] [PermissionSet(SecurityAction.InheritanceDemand, Name="FullTrust")] [Serializable] public class TempFileCollection : ICollection, IDisposable { private static RNGCryptoServiceProvider rng; string basePath; string tempDir; bool keepFiles; Hashtable files; static TempFileCollection() { // Since creating the random generator can be expensive, only do it once rng = new RNGCryptoServiceProvider(); } ///Represents a collection of temporary file names that are all based on a /// single base filename located in a temporary directory. ////// public TempFileCollection() : this(null, false) { } ///[To be supplied.] ////// public TempFileCollection(string tempDir) : this(tempDir, false) { } ///[To be supplied.] ////// public TempFileCollection(string tempDir, bool keepFiles) { this.keepFiles = keepFiles; this.tempDir = tempDir; #if !FEATURE_CASE_SENSITIVE_FILESYSTEM files = new Hashtable(StringComparer.OrdinalIgnoreCase); #else files = new Hashtable(); #endif } ///[To be supplied.] ////// /// void IDisposable.Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { // It is safe to call Delete from here even if Dispose is called from Finalizer // because the graph of objects is guaranteed to be there and // neither Hashtable nor String have a finalizer of their own that could // be called before TempFileCollection Finalizer Delete(); } ///To allow it's stuff to be cleaned up ////// ~TempFileCollection() { Dispose(false); } ///[To be supplied.] ////// public string AddExtension(string fileExtension) { return AddExtension(fileExtension, keepFiles); } ///[To be supplied.] ////// public string AddExtension(string fileExtension, bool keepFile) { if (fileExtension == null || fileExtension.Length == 0) throw new ArgumentException(SR.GetString(SR.InvalidNullEmptyArgument, "fileExtension"), "fileExtension"); // fileExtension not specified string fileName = BasePath + "." + fileExtension; AddFile(fileName, keepFile); return fileName; } ///[To be supplied.] ////// public void AddFile(string fileName, bool keepFile) { if (fileName == null || fileName.Length == 0) throw new ArgumentException(SR.GetString(SR.InvalidNullEmptyArgument, "fileName"), "fileName"); // fileName not specified if (files[fileName] != null) throw new ArgumentException(SR.GetString(SR.DuplicateFileName, fileName), "fileName"); // duplicate fileName files.Add(fileName, (object)keepFile); } ///[To be supplied.] ////// public IEnumerator GetEnumerator() { return files.Keys.GetEnumerator(); } ///[To be supplied.] ///IEnumerator IEnumerable.GetEnumerator() { return files.Keys.GetEnumerator(); } /// void ICollection.CopyTo(Array array, int start) { files.Keys.CopyTo(array, start); } /// /// public void CopyTo(string[] fileNames, int start) { files.Keys.CopyTo(fileNames, start); } ///[To be supplied.] ////// public int Count { get { return files.Count; } } ///[To be supplied.] ///int ICollection.Count { get { return files.Count; } } /// object ICollection.SyncRoot { get { return null; } } /// bool ICollection.IsSynchronized { get { return false; } } /// /// public string TempDir { get { return tempDir == null ? string.Empty : tempDir; } } ///[To be supplied.] ////// public string BasePath { get { EnsureTempNameCreated(); return basePath; } } void EnsureTempNameCreated() { if (basePath == null) { string tempFileName = null; FileStream tempFileStream; bool uniqueFile = false; int retryCount = 5000; do { try { basePath = GetTempFileName(TempDir); string full = basePath; new EnvironmentPermission(PermissionState.Unrestricted).Assert(); try { full = Path.GetFullPath(basePath); } finally { CodeAccessPermission.RevertAssert(); } new FileIOPermission(FileIOPermissionAccess.AllAccess, full).Demand(); // make sure the filename is unique. tempFileName = basePath + ".tmp"; using (tempFileStream = new FileStream(tempFileName, FileMode.CreateNew, FileAccess.Write)) { } uniqueFile = true; } catch (IOException e) { retryCount--; if (retryCount == 0 || Marshal.GetHRForException(e) != NativeMethods.ERROR_FILE_EXISTS) throw; uniqueFile = false; } }while (!uniqueFile); files.Add(tempFileName, keepFiles); } } ///[To be supplied.] ////// public bool KeepFiles { get { return keepFiles; } set { keepFiles = value; } } bool KeepFile(string fileName) { object keep = files[fileName]; if (keep == null) return false; return (bool)keep; } ///[To be supplied.] ////// [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] public void Delete() { if (files != null) { string[] fileNames = new string[files.Count]; files.Keys.CopyTo(fileNames, 0); foreach (string fileName in fileNames) { if (!KeepFile(fileName)) { Delete(fileName); files.Remove(fileName); } } } } // This function deletes files after reverting impersonation. internal void SafeDelete() { #if !FEATURE_PAL WindowsImpersonationContext impersonation = Executor.RevertImpersonation(); #endif try{ Delete(); } finally { #if !FEATURE_PAL Executor.ReImpersonate(impersonation); #endif } } [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] void Delete(string fileName) { try { File.Delete(fileName); } catch { // Ignore all exceptions } } [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] static string GetTempFileName(string tempDir) { if (tempDir == null || tempDir.Length == 0) { tempDir = Path.GetTempPath(); } string fileName = GenerateRandomFileName(); if (tempDir.EndsWith("\\", StringComparison.Ordinal)) return tempDir + fileName; return tempDir + "\\" + fileName; } // Generate a random file name with 8 characters static string GenerateRandomFileName() { // Generate random bytes byte[] data = new byte[6]; lock (rng) { rng.GetBytes(data); } // Turn them into a string containing only characters valid in file names/url string s = Convert.ToBase64String(data).ToLower(CultureInfo.InvariantCulture); s = s.Replace('/', '-'); s = s.Replace('+', '_'); return s; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //[To be supplied.] ///// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.CodeDom.Compiler { using System; using System.Collections; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; using System.Text; using Microsoft.Win32; using System.Security; using System.Security.Permissions; using System.Security.Principal; using System.ComponentModel; using System.Security.Cryptography; using System.Globalization; using System.Runtime.Versioning; ////// [PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")] [PermissionSet(SecurityAction.InheritanceDemand, Name="FullTrust")] [Serializable] public class TempFileCollection : ICollection, IDisposable { private static RNGCryptoServiceProvider rng; string basePath; string tempDir; bool keepFiles; Hashtable files; static TempFileCollection() { // Since creating the random generator can be expensive, only do it once rng = new RNGCryptoServiceProvider(); } ///Represents a collection of temporary file names that are all based on a /// single base filename located in a temporary directory. ////// public TempFileCollection() : this(null, false) { } ///[To be supplied.] ////// public TempFileCollection(string tempDir) : this(tempDir, false) { } ///[To be supplied.] ////// public TempFileCollection(string tempDir, bool keepFiles) { this.keepFiles = keepFiles; this.tempDir = tempDir; #if !FEATURE_CASE_SENSITIVE_FILESYSTEM files = new Hashtable(StringComparer.OrdinalIgnoreCase); #else files = new Hashtable(); #endif } ///[To be supplied.] ////// /// void IDisposable.Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { // It is safe to call Delete from here even if Dispose is called from Finalizer // because the graph of objects is guaranteed to be there and // neither Hashtable nor String have a finalizer of their own that could // be called before TempFileCollection Finalizer Delete(); } ///To allow it's stuff to be cleaned up ////// ~TempFileCollection() { Dispose(false); } ///[To be supplied.] ////// public string AddExtension(string fileExtension) { return AddExtension(fileExtension, keepFiles); } ///[To be supplied.] ////// public string AddExtension(string fileExtension, bool keepFile) { if (fileExtension == null || fileExtension.Length == 0) throw new ArgumentException(SR.GetString(SR.InvalidNullEmptyArgument, "fileExtension"), "fileExtension"); // fileExtension not specified string fileName = BasePath + "." + fileExtension; AddFile(fileName, keepFile); return fileName; } ///[To be supplied.] ////// public void AddFile(string fileName, bool keepFile) { if (fileName == null || fileName.Length == 0) throw new ArgumentException(SR.GetString(SR.InvalidNullEmptyArgument, "fileName"), "fileName"); // fileName not specified if (files[fileName] != null) throw new ArgumentException(SR.GetString(SR.DuplicateFileName, fileName), "fileName"); // duplicate fileName files.Add(fileName, (object)keepFile); } ///[To be supplied.] ////// public IEnumerator GetEnumerator() { return files.Keys.GetEnumerator(); } ///[To be supplied.] ///IEnumerator IEnumerable.GetEnumerator() { return files.Keys.GetEnumerator(); } /// void ICollection.CopyTo(Array array, int start) { files.Keys.CopyTo(array, start); } /// /// public void CopyTo(string[] fileNames, int start) { files.Keys.CopyTo(fileNames, start); } ///[To be supplied.] ////// public int Count { get { return files.Count; } } ///[To be supplied.] ///int ICollection.Count { get { return files.Count; } } /// object ICollection.SyncRoot { get { return null; } } /// bool ICollection.IsSynchronized { get { return false; } } /// /// public string TempDir { get { return tempDir == null ? string.Empty : tempDir; } } ///[To be supplied.] ////// public string BasePath { get { EnsureTempNameCreated(); return basePath; } } void EnsureTempNameCreated() { if (basePath == null) { string tempFileName = null; FileStream tempFileStream; bool uniqueFile = false; int retryCount = 5000; do { try { basePath = GetTempFileName(TempDir); string full = basePath; new EnvironmentPermission(PermissionState.Unrestricted).Assert(); try { full = Path.GetFullPath(basePath); } finally { CodeAccessPermission.RevertAssert(); } new FileIOPermission(FileIOPermissionAccess.AllAccess, full).Demand(); // make sure the filename is unique. tempFileName = basePath + ".tmp"; using (tempFileStream = new FileStream(tempFileName, FileMode.CreateNew, FileAccess.Write)) { } uniqueFile = true; } catch (IOException e) { retryCount--; if (retryCount == 0 || Marshal.GetHRForException(e) != NativeMethods.ERROR_FILE_EXISTS) throw; uniqueFile = false; } }while (!uniqueFile); files.Add(tempFileName, keepFiles); } } ///[To be supplied.] ////// public bool KeepFiles { get { return keepFiles; } set { keepFiles = value; } } bool KeepFile(string fileName) { object keep = files[fileName]; if (keep == null) return false; return (bool)keep; } ///[To be supplied.] ////// [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] public void Delete() { if (files != null) { string[] fileNames = new string[files.Count]; files.Keys.CopyTo(fileNames, 0); foreach (string fileName in fileNames) { if (!KeepFile(fileName)) { Delete(fileName); files.Remove(fileName); } } } } // This function deletes files after reverting impersonation. internal void SafeDelete() { #if !FEATURE_PAL WindowsImpersonationContext impersonation = Executor.RevertImpersonation(); #endif try{ Delete(); } finally { #if !FEATURE_PAL Executor.ReImpersonate(impersonation); #endif } } [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] void Delete(string fileName) { try { File.Delete(fileName); } catch { // Ignore all exceptions } } [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] static string GetTempFileName(string tempDir) { if (tempDir == null || tempDir.Length == 0) { tempDir = Path.GetTempPath(); } string fileName = GenerateRandomFileName(); if (tempDir.EndsWith("\\", StringComparison.Ordinal)) return tempDir + fileName; return tempDir + "\\" + fileName; } // Generate a random file name with 8 characters static string GenerateRandomFileName() { // Generate random bytes byte[] data = new byte[6]; lock (rng) { rng.GetBytes(data); } // Turn them into a string containing only characters valid in file names/url string s = Convert.ToBase64String(data).ToLower(CultureInfo.InvariantCulture); s = s.Replace('/', '-'); s = s.Replace('+', '_'); return s; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.[To be supplied.] ///
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ConvertTextFrag.cs
- MemberInfoSerializationHolder.cs
- DetailsView.cs
- entityreference_tresulttype.cs
- XmlRootAttribute.cs
- OAVariantLib.cs
- shaperfactoryquerycachekey.cs
- TemplateControlBuildProvider.cs
- RequestTimeoutManager.cs
- EmptyReadOnlyDictionaryInternal.cs
- Application.cs
- DocComment.cs
- URLString.cs
- CollectionChangeEventArgs.cs
- CallSite.cs
- EventMappingSettings.cs
- TCPClient.cs
- ContentElement.cs
- DynamicDataExtensions.cs
- SystemKeyConverter.cs
- DefaultEvaluationContext.cs
- Point4DValueSerializer.cs
- ConnectionProviderAttribute.cs
- TickBar.cs
- ConfigurationStrings.cs
- NamespaceList.cs
- SrgsElementFactory.cs
- ExpressionEditorAttribute.cs
- FrameSecurityDescriptor.cs
- HtmlHead.cs
- TreeNodeBinding.cs
- Visual3D.cs
- FixedSOMTableCell.cs
- CounterSet.cs
- CurrentTimeZone.cs
- BaseComponentEditor.cs
- XmlReaderDelegator.cs
- QueryGeneratorBase.cs
- TraceEventCache.cs
- RC2.cs
- InputMethodStateTypeInfo.cs
- ButtonField.cs
- TextSelectionHelper.cs
- WorkingDirectoryEditor.cs
- metadatamappinghashervisitor.cs
- IgnoreFileBuildProvider.cs
- PolicyLevel.cs
- BorderGapMaskConverter.cs
- ProjectionPruner.cs
- DotExpr.cs
- SqlWorkflowPersistenceService.cs
- ExtentCqlBlock.cs
- DependencyObject.cs
- DbConnectionClosed.cs
- LiteralTextParser.cs
- DataSvcMapFile.cs
- DocumentPageViewAutomationPeer.cs
- IncrementalCompileAnalyzer.cs
- ClockController.cs
- GraphicsPath.cs
- MethodBuilderInstantiation.cs
- Brushes.cs
- InstanceDataCollection.cs
- IteratorFilter.cs
- CategoryGridEntry.cs
- TextContainerHelper.cs
- ServiceContractDetailViewControl.cs
- HttpProfileGroupBase.cs
- TheQuery.cs
- XmlElementAttribute.cs
- RichTextBoxConstants.cs
- ClearTypeHintValidation.cs
- BindableAttribute.cs
- PageStatePersister.cs
- ConfigurationManagerHelper.cs
- FixedDocumentSequencePaginator.cs
- DataRowChangeEvent.cs
- EventManager.cs
- EntityReference.cs
- SimplePropertyEntry.cs
- streamingZipPartStream.cs
- DataSet.cs
- MimeTypeAttribute.cs
- ToolStripSplitButton.cs
- SplitContainer.cs
- ExtendedPropertyDescriptor.cs
- XamlSerializationHelper.cs
- UriExt.cs
- ToolStripMenuItemCodeDomSerializer.cs
- ExpressionBuilder.cs
- TcpAppDomainProtocolHandler.cs
- ExpanderAutomationPeer.cs
- TaiwanCalendar.cs
- TableCellCollection.cs
- ObjectStateEntryDbDataRecord.cs
- ACE.cs
- WasAdminWrapper.cs
- DataGridViewSelectedCellCollection.cs
- ProcessHostConfigUtils.cs
- SchemaComplexType.cs