Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / clr / src / BCL / System / IO / DriveInfo.cs / 2 / DriveInfo.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: DriveInfo ** ** ** Purpose: Exposes routines for exploring a drive. ** ** ===========================================================*/ using System; using System.Text; using System.Runtime.InteropServices; using Microsoft.Win32; using System.Security.Permissions; using System.Runtime.Serialization; using System.Runtime.Versioning; namespace System.IO { // Matches Win32's DRIVE_XXX #defines from winbase.h [Serializable] [System.Runtime.InteropServices.ComVisible(true)] public enum DriveType { Unknown = 0, NoRootDirectory = 1, Removable = 2, Fixed = 3, Network = 4, CDRom = 5, Ram = 6 } // Ideally we'll get a better security permission, but possibly // not for Whidbey. [Serializable] [ComVisible(true)] public sealed class DriveInfo : ISerializable { private String _name; private const String NameField = "_name"; // For serialization public DriveInfo(String driveName) { if (driveName == null) throw new ArgumentNullException("driveName"); if (driveName.Length == 1) _name = driveName + ":\\"; else { // GetPathRoot does not Path.CheckInvalidPathChars(driveName); _name = Path.GetPathRoot(driveName); // Disallow null or empty drive letters and UNC paths if (_name == null || _name.Length == 0 || _name.StartsWith("\\\\", StringComparison.Ordinal)) throw new ArgumentException(Environment.GetResourceString("Arg_MustBeDriveLetterOrRootDir")); } // We want to normalize to have a trailing backslash so we don't have two equivalent forms and // because some Win32 API don't work without it. if (_name.Length == 2 && _name[1] == ':') { _name = _name + "\\"; } // Now verify that the drive letter could be a real drive name. // On Windows this means it's between A and Z, ignoring case. // On a Unix platform, perhaps this should be a device name with // a partition like /dev/hdc0, or possibly a mount point. char letter = driveName[0]; if (!((letter >= 'A' && letter <= 'Z') || (letter >= 'a' && letter <= 'z'))) throw new ArgumentException(Environment.GetResourceString("Arg_MustBeDriveLetterOrRootDir")); // Now do a security String demandPath = _name + '.'; new FileIOPermission(FileIOPermissionAccess.PathDiscovery, demandPath).Demand(); } private DriveInfo(SerializationInfo info, StreamingContext context) { // Need to add in a security _name = (String) info.GetValue(NameField, typeof(String)); // Now do a security String demandPath = _name + '.'; new FileIOPermission(FileIOPermissionAccess.PathDiscovery, demandPath).Demand(); } public String Name { get { return _name; } } public DriveType DriveType { get { // GetDriveType can't fail return (DriveType) Win32Native.GetDriveType(Name); } } public String DriveFormat { [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Process, ResourceScope.Process)] get { const int volNameLen = 50; StringBuilder volumeName = new StringBuilder(volNameLen); const int fileSystemNameLen = 50; StringBuilder fileSystemName = new StringBuilder(fileSystemNameLen); int serialNumber, maxFileNameLen, fileSystemFlags; int oldMode = Win32Native.SetErrorMode(Win32Native.SEM_FAILCRITICALERRORS); try { bool r = Win32Native.GetVolumeInformation(Name, volumeName, volNameLen, out serialNumber, out maxFileNameLen, out fileSystemFlags, fileSystemName, fileSystemNameLen); if (!r) { int errorCode = Marshal.GetLastWin32Error(); // Win9x appears to return ERROR_INVALID_DATA when a // drive doesn't exist. if (errorCode == Win32Native.ERROR_INVALID_DATA) errorCode = Win32Native.ERROR_INVALID_DRIVE; __Error.WinIODriveError(Name, errorCode); } } finally { Win32Native.SetErrorMode(oldMode); } return fileSystemName.ToString(); } } public bool IsReady { [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] get { return Directory.InternalExists(Name); } } public long AvailableFreeSpace { [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Process, ResourceScope.Process)] get { long userBytes, totalBytes, freeBytes; int oldMode = Win32Native.SetErrorMode(Win32Native.SEM_FAILCRITICALERRORS); try { bool r = Win32Native.GetDiskFreeSpaceEx(Name, out userBytes, out totalBytes, out freeBytes); if (!r) __Error.WinIODriveError(Name); } finally { Win32Native.SetErrorMode(oldMode); } return userBytes; } } public long TotalFreeSpace { [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Process, ResourceScope.Process)] get { long userBytes, totalBytes, freeBytes; int oldMode = Win32Native.SetErrorMode(Win32Native.SEM_FAILCRITICALERRORS); try { bool r = Win32Native.GetDiskFreeSpaceEx(Name, out userBytes, out totalBytes, out freeBytes); if (!r) __Error.WinIODriveError(Name); } finally { Win32Native.SetErrorMode(oldMode); } return freeBytes; } } public long TotalSize { [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Process, ResourceScope.Process)] get { // Don't cache this, to handle variable sized floppy drives // or other various removable media drives. long userBytes, totalBytes, freeBytes; int oldMode = Win32Native.SetErrorMode(Win32Native.SEM_FAILCRITICALERRORS); try { bool r = Win32Native.GetDiskFreeSpaceEx(Name, out userBytes, out totalBytes, out freeBytes); if (!r) __Error.WinIODriveError(Name); } finally { Win32Native.SetErrorMode(oldMode); } return totalBytes; } } [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] public static DriveInfo[] GetDrives() { // Directory.GetLogicalDrives demands unmanaged code permission String[] drives = Directory.GetLogicalDrives(); DriveInfo[] di = new DriveInfo[drives.Length]; for(int i=0; i// No need for LinkDemand of SerializationFormatter here as this is a interface private // methodimpl and the linkdeamand specified on ISerializable will cover this. void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { // No need for an additional security info.AddValue(NameField, _name, typeof(String)); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- RelationshipDetailsCollection.cs
- SqlInternalConnection.cs
- sqlnorm.cs
- FontCacheUtil.cs
- DataListItemEventArgs.cs
- FixedTextPointer.cs
- QuestionEventArgs.cs
- DesignOnlyAttribute.cs
- CollectionBuilder.cs
- XmlSchemaSimpleTypeUnion.cs
- CommandValueSerializer.cs
- externdll.cs
- ToolBarButton.cs
- DataPagerCommandEventArgs.cs
- ScriptingScriptResourceHandlerSection.cs
- WindowsFormsSectionHandler.cs
- GPStream.cs
- CancellationToken.cs
- StringAttributeCollection.cs
- WinEventTracker.cs
- ConfigXmlWhitespace.cs
- DragEvent.cs
- ScalarType.cs
- IgnoreDeviceFilterElementCollection.cs
- StandardCommands.cs
- InvokeCompletedEventArgs.cs
- Renderer.cs
- WindowsSysHeader.cs
- ListDictionaryInternal.cs
- AssemblyHelper.cs
- RuleElement.cs
- ListControlActionList.cs
- FileClassifier.cs
- FixedPosition.cs
- NonDualMessageSecurityOverHttpElement.cs
- DropDownList.cs
- Decoder.cs
- ErrorProvider.cs
- RelationshipConverter.cs
- XmlElementElementCollection.cs
- RSAPKCS1SignatureDeformatter.cs
- NameValueFileSectionHandler.cs
- OperatorExpressions.cs
- ResponseStream.cs
- AcceleratedTokenProvider.cs
- Soap12FormatExtensions.cs
- X509SecurityToken.cs
- SchemaImporterExtensionElementCollection.cs
- RandomDelayQueuedSendsAsyncResult.cs
- PaperSize.cs
- CompletionProxy.cs
- QueryAccessibilityHelpEvent.cs
- EmptyControlCollection.cs
- Compiler.cs
- DisplayNameAttribute.cs
- ValidationHelper.cs
- DataKey.cs
- SHA1CryptoServiceProvider.cs
- ClientData.cs
- SiteMembershipCondition.cs
- DispatcherEventArgs.cs
- HashCryptoHandle.cs
- ContentOperations.cs
- DecimalAnimationBase.cs
- EllipseGeometry.cs
- SystemBrushes.cs
- OptimizedTemplateContentHelper.cs
- EventArgs.cs
- MarkerProperties.cs
- AutomationPeer.cs
- PagerStyle.cs
- WindowsUpDown.cs
- HtmlPanelAdapter.cs
- Activator.cs
- HtmlInputFile.cs
- CrossAppDomainChannel.cs
- FormViewPagerRow.cs
- XMLSchema.cs
- MyContact.cs
- DataViewListener.cs
- OpenTypeLayout.cs
- UiaCoreTypesApi.cs
- DecimalAnimationBase.cs
- FileUpload.cs
- RadioButton.cs
- DateTimeStorage.cs
- WebPermission.cs
- Button.cs
- DesignBindingPicker.cs
- IHttpResponseInternal.cs
- HostingEnvironmentException.cs
- SafeViewOfFileHandle.cs
- VisualTarget.cs
- Drawing.cs
- unsafenativemethodsother.cs
- DataFormat.cs
- ReferenceEqualityComparer.cs
- IISUnsafeMethods.cs
- HttpCachePolicyElement.cs
- SubclassTypeValidatorAttribute.cs