Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / xsp / System / Web / Util / FileEnumerator.cs / 1 / FileEnumerator.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- /* * FileEnumerator class * * Copyright (c) 2003 Microsoft Corporation * * Class to efficiently enumerate the files in a directory. The only thing the framework provides * to do this is Directory.GetFiles(), which is unusable on large directories because it returns an * array containing all the file names at once (huge memory allocation). * * An efficient alternative is to use FindFirstFile/FindNextFile, which works but requires a lot * more code. Also, it makes our code base harder to port to non-windows platforms. * * This FileEnumerator class solves both problem, by providing a simple and efficient wrapper. * By working with a single object, it is almost as efficient as calling FindFirstFile/FindNextFile, * but is much easier to use. e.g. instead of: * * UnsafeNativeMethods.WIN32_FIND_DATA wfd; * IntPtr hFindFile = UnsafeNativeMethods.FindFirstFile(physicalDir + @"\*.*", out wfd); * * if (hFindFile == INVALID_HANDLE_VALUE) * return; * * try { * for (bool more=true; more; more=UnsafeNativeMethods.FindNextFile(hFindFile, out wfd)) { * * // Skip false directories * if (wfd.cFileName == "." || wfd.cFileName == "..") * continue; * * string fullPath = Path.Combine(physicalDir, wfd.cFileName); * * ProcessFile(fullPath); * } * } * finally { * UnsafeNativeMethods.FindClose(hFindFile); * } * * we can simply write * * foreach (FileData fileData in FileEnumerator.Create(physicalDir)) { * ProcessFile(fileData.FullName); * } */ namespace System.Web.Util { using System.IO; using System.Collections; /* * This is a somewhat artificial base class for FileEnumerator. The main reason * for it is to allow user code to be more readable, by looking like: * foreach (FileData fileData in FileEnumerator.Create(path)) { ... } * instead of * foreach (FileEnumerator fileData in FileEnumerator.Create(path)) { ... } */ internal abstract class FileData { protected string _path; protected UnsafeNativeMethods.WIN32_FIND_DATA _wfd; internal string Name { get { return _wfd.cFileName; } } internal string FullName { get { return _path + @"\" + _wfd.cFileName; } } internal bool IsDirectory { get { return (_wfd.dwFileAttributes & UnsafeNativeMethods.FILE_ATTRIBUTE_DIRECTORY) != 0; } } internal bool IsHidden { get { return (_wfd.dwFileAttributes & UnsafeNativeMethods.FILE_ATTRIBUTE_HIDDEN) != 0; } } internal FindFileData GetFindFileData() { return new FindFileData(ref _wfd); } } internal class FileEnumerator: FileData, IEnumerable, IEnumerator, IDisposable { private IntPtr _hFindFile = UnsafeNativeMethods.INVALID_HANDLE_VALUE; internal static FileEnumerator Create(string path) { return new FileEnumerator(path); } private FileEnumerator(string path) { _path = Path.GetFullPath(path); } ~FileEnumerator() { ((IDisposable)this).Dispose(); } // Should the current file be excluded from the enumeration private bool SkipCurrent() { // Skip false directories if (_wfd.cFileName == "." || _wfd.cFileName == "..") return true; return false; } // We just return ourselves for the enumerator, to avoid creating a new object IEnumerator IEnumerable.GetEnumerator() { return this; } bool IEnumerator.MoveNext() { for (;;) { if (_hFindFile == UnsafeNativeMethods.INVALID_HANDLE_VALUE) { _hFindFile = UnsafeNativeMethods.FindFirstFile(_path + @"\*.*", out _wfd); // Empty enumeration case if (_hFindFile == UnsafeNativeMethods.INVALID_HANDLE_VALUE) return false; } else { bool hasMoreFiles = UnsafeNativeMethods.FindNextFile(_hFindFile, out _wfd); if (!hasMoreFiles) return false; } if (!SkipCurrent()) return true; } } // The current object of the enumeration is always ourselves. No new object created. object IEnumerator.Current { get { return this; } } void IEnumerator.Reset() { // We don't support reset, though it would be easy to add if needed throw new InvalidOperationException(); } void IDisposable.Dispose() { if (_hFindFile != UnsafeNativeMethods.INVALID_HANDLE_VALUE) { UnsafeNativeMethods.FindClose(_hFindFile); _hFindFile = UnsafeNativeMethods.INVALID_HANDLE_VALUE; } System.GC.SuppressFinalize(this); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- /* * FileEnumerator class * * Copyright (c) 2003 Microsoft Corporation * * Class to efficiently enumerate the files in a directory. The only thing the framework provides * to do this is Directory.GetFiles(), which is unusable on large directories because it returns an * array containing all the file names at once (huge memory allocation). * * An efficient alternative is to use FindFirstFile/FindNextFile, which works but requires a lot * more code. Also, it makes our code base harder to port to non-windows platforms. * * This FileEnumerator class solves both problem, by providing a simple and efficient wrapper. * By working with a single object, it is almost as efficient as calling FindFirstFile/FindNextFile, * but is much easier to use. e.g. instead of: * * UnsafeNativeMethods.WIN32_FIND_DATA wfd; * IntPtr hFindFile = UnsafeNativeMethods.FindFirstFile(physicalDir + @"\*.*", out wfd); * * if (hFindFile == INVALID_HANDLE_VALUE) * return; * * try { * for (bool more=true; more; more=UnsafeNativeMethods.FindNextFile(hFindFile, out wfd)) { * * // Skip false directories * if (wfd.cFileName == "." || wfd.cFileName == "..") * continue; * * string fullPath = Path.Combine(physicalDir, wfd.cFileName); * * ProcessFile(fullPath); * } * } * finally { * UnsafeNativeMethods.FindClose(hFindFile); * } * * we can simply write * * foreach (FileData fileData in FileEnumerator.Create(physicalDir)) { * ProcessFile(fileData.FullName); * } */ namespace System.Web.Util { using System.IO; using System.Collections; /* * This is a somewhat artificial base class for FileEnumerator. The main reason * for it is to allow user code to be more readable, by looking like: * foreach (FileData fileData in FileEnumerator.Create(path)) { ... } * instead of * foreach (FileEnumerator fileData in FileEnumerator.Create(path)) { ... } */ internal abstract class FileData { protected string _path; protected UnsafeNativeMethods.WIN32_FIND_DATA _wfd; internal string Name { get { return _wfd.cFileName; } } internal string FullName { get { return _path + @"\" + _wfd.cFileName; } } internal bool IsDirectory { get { return (_wfd.dwFileAttributes & UnsafeNativeMethods.FILE_ATTRIBUTE_DIRECTORY) != 0; } } internal bool IsHidden { get { return (_wfd.dwFileAttributes & UnsafeNativeMethods.FILE_ATTRIBUTE_HIDDEN) != 0; } } internal FindFileData GetFindFileData() { return new FindFileData(ref _wfd); } } internal class FileEnumerator: FileData, IEnumerable, IEnumerator, IDisposable { private IntPtr _hFindFile = UnsafeNativeMethods.INVALID_HANDLE_VALUE; internal static FileEnumerator Create(string path) { return new FileEnumerator(path); } private FileEnumerator(string path) { _path = Path.GetFullPath(path); } ~FileEnumerator() { ((IDisposable)this).Dispose(); } // Should the current file be excluded from the enumeration private bool SkipCurrent() { // Skip false directories if (_wfd.cFileName == "." || _wfd.cFileName == "..") return true; return false; } // We just return ourselves for the enumerator, to avoid creating a new object IEnumerator IEnumerable.GetEnumerator() { return this; } bool IEnumerator.MoveNext() { for (;;) { if (_hFindFile == UnsafeNativeMethods.INVALID_HANDLE_VALUE) { _hFindFile = UnsafeNativeMethods.FindFirstFile(_path + @"\*.*", out _wfd); // Empty enumeration case if (_hFindFile == UnsafeNativeMethods.INVALID_HANDLE_VALUE) return false; } else { bool hasMoreFiles = UnsafeNativeMethods.FindNextFile(_hFindFile, out _wfd); if (!hasMoreFiles) return false; } if (!SkipCurrent()) return true; } } // The current object of the enumeration is always ourselves. No new object created. object IEnumerator.Current { get { return this; } } void IEnumerator.Reset() { // We don't support reset, though it would be easy to add if needed throw new InvalidOperationException(); } void IDisposable.Dispose() { if (_hFindFile != UnsafeNativeMethods.INVALID_HANDLE_VALUE) { UnsafeNativeMethods.FindClose(_hFindFile); _hFindFile = UnsafeNativeMethods.INVALID_HANDLE_VALUE; } System.GC.SuppressFinalize(this); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- OleDbDataReader.cs
- DataGridViewAdvancedBorderStyle.cs
- BrushConverter.cs
- DateTimeParse.cs
- ParseElement.cs
- PropertiesTab.cs
- TreeBuilderBamlTranslator.cs
- ComEventsInfo.cs
- Types.cs
- versioninfo.cs
- TraceLevelStore.cs
- PropertyToken.cs
- WebZone.cs
- SafeProcessHandle.cs
- SpecularMaterial.cs
- DynamicILGenerator.cs
- XmlObjectSerializerWriteContext.cs
- DataTablePropertyDescriptor.cs
- _NetworkingPerfCounters.cs
- DataGridColumnsPage.cs
- TemplateControlParser.cs
- EventToken.cs
- SafeReversePInvokeHandle.cs
- ViewGenerator.cs
- TypeConverterValueSerializer.cs
- EncoderParameters.cs
- SqlConnectionPoolProviderInfo.cs
- CustomTrackingRecord.cs
- ToolStripPanelSelectionBehavior.cs
- ScriptReference.cs
- PropertyStore.cs
- XsltCompileContext.cs
- PathSegmentCollection.cs
- WorkflowServiceAttributesTypeConverter.cs
- Menu.cs
- XmlAttributeAttribute.cs
- DetailsViewUpdateEventArgs.cs
- UIElement.cs
- DataGridViewCellContextMenuStripNeededEventArgs.cs
- ReversePositionQuery.cs
- WebBrowsableAttribute.cs
- COM2EnumConverter.cs
- ObjectAssociationEndMapping.cs
- KeyManager.cs
- RootAction.cs
- FileDialogCustomPlace.cs
- URLMembershipCondition.cs
- TrackingMemoryStream.cs
- ListBox.cs
- MarshalByRefObject.cs
- BookmarkList.cs
- CacheMode.cs
- FieldAccessException.cs
- SynchronizedRandom.cs
- DispatcherEventArgs.cs
- ClosableStream.cs
- FormsAuthenticationCredentials.cs
- DataGridParentRows.cs
- Helper.cs
- UnsafeNativeMethodsCLR.cs
- MultipartContentParser.cs
- EntityConnectionStringBuilderItem.cs
- MonthChangedEventArgs.cs
- PropertyRecord.cs
- ClaimTypes.cs
- prefixendpointaddressmessagefiltertable.cs
- rsa.cs
- DetailsViewCommandEventArgs.cs
- GridViewRow.cs
- CrossSiteScriptingValidation.cs
- ConsoleKeyInfo.cs
- BitmapData.cs
- XsdValidatingReader.cs
- TransformGroup.cs
- RemoteWebConfigurationHostStream.cs
- FontDriver.cs
- TreeNodeBindingCollection.cs
- objectresult_tresulttype.cs
- Size.cs
- TempEnvironment.cs
- GridViewUpdatedEventArgs.cs
- PagerSettings.cs
- OleDbConnectionPoolGroupProviderInfo.cs
- NamespaceList.cs
- MachinePropertyVariants.cs
- ProcessHostFactoryHelper.cs
- ReflectEventDescriptor.cs
- CryptoApi.cs
- SystemInformation.cs
- ScrollEvent.cs
- SrgsSemanticInterpretationTag.cs
- DataConnectionHelper.cs
- UserControlBuildProvider.cs
- SamlAssertion.cs
- Point4D.cs
- ByteAnimationBase.cs
- UIElement3DAutomationPeer.cs
- XmlSchemaValidationException.cs
- RegexRunner.cs
- TempEnvironment.cs