Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / clr / src / BCL / System / IO / DirectoryInfo.cs / 2 / DirectoryInfo.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: DirectoryInfo ** ** ** Purpose: Exposes routines for enumerating through a ** directory. ** ** April 11,2000 ** ===========================================================*/ using System; using System.Collections; using System.Security; #if !FEATURE_PAL using System.Security.AccessControl; #endif using System.Security.Permissions; using Microsoft.Win32; using System.Text; using System.Runtime.InteropServices; using System.Globalization; using System.Runtime.Serialization; using System.Runtime.Versioning; namespace System.IO { [Serializable] [ComVisible(true)] public sealed class DirectoryInfo : FileSystemInfo { private String[] demandDir; [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] public DirectoryInfo(String path) { if (path==null) throw new ArgumentNullException("path"); // Special case ":" to point to " " instead if ((path.Length == 2) && (path[1] == ':')) OriginalPath = "."; else OriginalPath = path; // Must fully qualify the path for the security String fullPath = Path.GetFullPathInternal(path); demandDir = new String[] {Directory.GetDemandDir(fullPath, true)}; new FileIOPermission(FileIOPermissionAccess.Read, demandDir, false, false ).Demand(); FullPath = fullPath; } [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] internal DirectoryInfo(String fullPath, bool junk) { BCLDebug.Assert(Path.GetRootLength(fullPath) > 0, "fullPath must be fully qualified!"); // Fast path when we know a DirectoryInfo exists. OriginalPath = Path.GetFileName(fullPath); FullPath = fullPath; demandDir = new String[] {Directory.GetDemandDir(fullPath, true)}; } private DirectoryInfo(SerializationInfo info, StreamingContext context) : base(info, context) { demandDir = new String[] {Directory.GetDemandDir(FullPath, true)}; new FileIOPermission(FileIOPermissionAccess.Read, demandDir, false, false ).Demand(); } public override String Name { [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] get { // FullPath might be either "c:\bar" or "c:\bar\". Handle // those cases, as well as avoiding mangling "c:\". String s = FullPath; if (s.Length > 3) { if (s.EndsWith(Path.DirectorySeparatorChar)) s = FullPath.Substring(0, FullPath.Length - 1); return Path.GetFileName(s); } return FullPath; // For rooted paths, like "c:\" } } public DirectoryInfo Parent { [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] get { String parentName; // FullPath might be either "c:\bar" or "c:\bar\". Handle // those cases, as well as avoiding mangling "c:\". String s = FullPath; if (s.Length > 3 && s.EndsWith(Path.DirectorySeparatorChar)) s = FullPath.Substring(0, FullPath.Length - 1); parentName = Path.GetDirectoryName(s); if (parentName==null) return null; DirectoryInfo dir = new DirectoryInfo(parentName,false); new FileIOPermission(FileIOPermissionAccess.PathDiscovery | FileIOPermissionAccess.Read, dir.demandDir, false, false).Demand(); return dir; } } [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] public DirectoryInfo CreateSubdirectory(String path) { #if !FEATURE_PAL return CreateSubdirectory(path, null); } [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] public DirectoryInfo CreateSubdirectory(String path, DirectorySecurity directorySecurity) { #endif if (path==null) throw new ArgumentNullException("path"); String newDirs = Path.InternalCombine(FullPath, path); String fullPath = Path.GetFullPathInternal(newDirs); if (0!=String.Compare(FullPath,0,fullPath,0, FullPath.Length,StringComparison.OrdinalIgnoreCase)) { String displayPath = __Error.GetDisplayablePath(OriginalPath, false); throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_InvalidSubPath"), path, displayPath)); } // Ensure we have permission to create this subdirectory. String demandDir = Directory.GetDemandDir(fullPath, true); new FileIOPermission(FileIOPermissionAccess.Write, new String[] { demandDir }, false, false ).Demand(); #if !FEATURE_PAL Directory.InternalCreateDirectory(fullPath, path, directorySecurity); #else Directory.InternalCreateDirectory(fullPath, path); #endif // Check for read permission to directory we hand back by calling this constructor. return new DirectoryInfo(fullPath); } [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] public void Create() { #if !FEATURE_PAL Directory.InternalCreateDirectory(FullPath, OriginalPath, null); #else Directory.InternalCreateDirectory(FullPath, OriginalPath); #endif } #if !FEATURE_PAL [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] public void Create(DirectorySecurity directorySecurity) { Directory.InternalCreateDirectory(FullPath, OriginalPath, directorySecurity); } #endif // Tests if the given path refers to an existing DirectoryInfo on disk. // // Your application must have Read permission to the directory's // contents. // public override bool Exists { get { try { if (_dataInitialised == -1) Refresh(); if (_dataInitialised != 0) // Refresh was unable to initialise the data return false; return _data.fileAttributes != -1 && (_data.fileAttributes & Win32Native.FILE_ATTRIBUTE_DIRECTORY) != 0; } catch { return false; } } } #if !FEATURE_PAL [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] public DirectorySecurity GetAccessControl() { return Directory.GetAccessControl(FullPath, AccessControlSections.Access | AccessControlSections.Owner | AccessControlSections.Group); } [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] public DirectorySecurity GetAccessControl(AccessControlSections includeSections) { return Directory.GetAccessControl(FullPath, includeSections); } [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] public void SetAccessControl(DirectorySecurity directorySecurity) { Directory.SetAccessControl(FullPath, directorySecurity); } #endif // Returns an array of Files in the current DirectoryInfo matching the // given search criteria (ie, "*.txt"). [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] public FileInfo[] GetFiles(String searchPattern) { return GetFiles(searchPattern, SearchOption.TopDirectoryOnly); } // Converts the fully qualified user path returned by InternalGetFileDirectoryNames // into fullpath by combining the relevant portion of it with the fullpath of this directory // For ex, converts foo\bar.txt into 'c:\temp\foo\bar.txt', where FullPath is 'c:\temp\foo' // and OriginalPath (aka userpath) is 'foo' private string FixupFileDirFullPath(String fileDirUserPath) { BCLDebug.Assert(fileDirUserPath != null,"InternalGetFileDirectoryNames returned paths should not be null!"); BCLDebug.Assert(fileDirUserPath.StartsWith(OriginalPath, StringComparison.Ordinal),"InternalGetFileDirectoryNames returned paths should start with user path!"); String fileDirFullPath; if (OriginalPath.Length == 0) { fileDirFullPath = Path.InternalCombine(FullPath, fileDirUserPath); } else if (OriginalPath.EndsWith(Path.DirectorySeparatorChar) || OriginalPath.EndsWith(Path.AltDirectorySeparatorChar)) { BCLDebug.Assert((fileDirUserPath[OriginalPath.Length-1] == Path.DirectorySeparatorChar) || (fileDirUserPath[OriginalPath.Length-1] == Path.AltDirectorySeparatorChar),"InternalGetFileDirectoryNames returned incorrect user path!"); fileDirFullPath = Path.InternalCombine(FullPath, fileDirUserPath.Substring(OriginalPath.Length)); } else { BCLDebug.Assert((fileDirUserPath[OriginalPath.Length] == Path.DirectorySeparatorChar),"InternalGetFileDirectoryNames returned incorrect user path!"); fileDirFullPath = Path.InternalCombine(FullPath, fileDirUserPath.Substring(OriginalPath.Length + 1)); } return fileDirFullPath; } // Returns an array of Files in the current DirectoryInfo matching the // given search criteria (ie, "*.txt"). [ResourceExposure(ResourceScope.Machine)] [ResourceConsumption(ResourceScope.Machine)] public FileInfo[] GetFiles(String searchPattern, SearchOption searchOption) { if (searchPattern==null) throw new ArgumentNullException("searchPattern"); String[] fileNames = Directory.InternalGetFileDirectoryNames(FullPath, OriginalPath, searchPattern, true, false, searchOption); // We need full path for permission for (int i = 0; i < fileNames.Length; i++) { fileNames[i] = FixupFileDirFullPath(fileNames[i]); } if (fileNames.Length != 0) new FileIOPermission(FileIOPermissionAccess.Read, fileNames, false, false).Demand(); FileInfo[] files = new FileInfo[fileNames.Length]; for(int i=0; i
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DescendentsWalkerBase.cs
- XmlSchemaParticle.cs
- RIPEMD160.cs
- CompilerGeneratedAttribute.cs
- MsmqMessageProperty.cs
- _UncName.cs
- RemotingServices.cs
- SqlParameterizer.cs
- MultipleViewProviderWrapper.cs
- EntityTypeEmitter.cs
- FormsAuthenticationTicket.cs
- ThicknessKeyFrameCollection.cs
- _BufferOffsetSize.cs
- MenuTracker.cs
- UpdateEventArgs.cs
- OrderPreservingSpoolingTask.cs
- WMIInterop.cs
- MarshalDirectiveException.cs
- PatternMatcher.cs
- TextBlock.cs
- HostAdapter.cs
- FormClosingEvent.cs
- Crypto.cs
- ProfileParameter.cs
- TreeViewCancelEvent.cs
- TextContainerHelper.cs
- XPathAxisIterator.cs
- SpeakCompletedEventArgs.cs
- WpfKnownType.cs
- StateRuntime.cs
- RootDesignerSerializerAttribute.cs
- GlyphRunDrawing.cs
- DbDataRecord.cs
- OleDbMetaDataFactory.cs
- SplineQuaternionKeyFrame.cs
- UpdatableGenericsFeature.cs
- Label.cs
- StylusPointCollection.cs
- AmbiguousMatchException.cs
- DataGridViewRowCollection.cs
- XamlValidatingReader.cs
- DomainConstraint.cs
- FixedSOMGroup.cs
- TypeUsageBuilder.cs
- XmlComment.cs
- Size.cs
- EditingScope.cs
- RubberbandSelector.cs
- ConnectionAcceptor.cs
- DebugView.cs
- MessageSmuggler.cs
- Catch.cs
- DataGridViewRowsRemovedEventArgs.cs
- EndpointDiscoveryMetadataCD1.cs
- LineBreak.cs
- ReflectTypeDescriptionProvider.cs
- TypeSystem.cs
- XmlSchemaDocumentation.cs
- HandleCollector.cs
- MarkupCompilePass1.cs
- IMembershipProvider.cs
- DataPagerFieldCollection.cs
- RelationshipDetailsRow.cs
- EnumerableWrapperWeakToStrong.cs
- RefreshInfo.cs
- WebEventCodes.cs
- HttpCookiesSection.cs
- SafeNativeMethods.cs
- ReceiveSecurityHeader.cs
- RegexGroupCollection.cs
- CorrelationActionMessageFilter.cs
- DrawingCollection.cs
- OverflowException.cs
- HMACSHA256.cs
- RelOps.cs
- PersistChildrenAttribute.cs
- RegexGroup.cs
- RC2.cs
- NativeRecognizer.cs
- TimelineGroup.cs
- MemberMaps.cs
- XmlAttributes.cs
- PropertyGroupDescription.cs
- AppLevelCompilationSectionCache.cs
- formatter.cs
- Delay.cs
- StateValidator.cs
- Speller.cs
- BaseAppDomainProtocolHandler.cs
- Mouse.cs
- WebPartChrome.cs
- PeerDuplexChannel.cs
- ControlCollection.cs
- SapiAttributeParser.cs
- XhtmlBasicValidatorAdapter.cs
- IdentitySection.cs
- TraceContextEventArgs.cs
- ContainerControl.cs
- SoapIgnoreAttribute.cs
- ColorPalette.cs