private IEnumerable <string> GetItemsInternal(string filter, DirectoryEnumerator.EnumerationType enumType, Predicate <NativeMethods.WIN32_FIND_DATA> extendedFilter = null) { string itemName; NativeMethods.WIN32_FIND_DATA findData; while (this.GetNextItem(filter, enumType, out itemName, out findData, extendedFilter)) { yield return(itemName); } if (this.m_recurse) { foreach (string dir in this.m_realDirectories) { string fullPath = Path.Combine(this.m_path.FullName, dir); using (DirectoryEnumerator dirEnum = new DirectoryEnumerator(new DirectoryInfo(fullPath), this.m_recurse, this.m_includeRecycleBin)) { foreach (string item in dirEnum.GetItemsInternal(filter, enumType, extendedFilter)) { yield return(item); } } } } yield break; }
private bool GetNextItem(string filter, DirectoryEnumerator.EnumerationType enumType, out string itemName, out NativeMethods.WIN32_FIND_DATA findData, Predicate <NativeMethods.WIN32_FIND_DATA> extendedFilter = null) { bool flag = false; bool flag2 = false; itemName = null; findData = default(NativeMethods.WIN32_FIND_DATA); findData.FileName = string.Empty; findData.FileSizeHigh = 0U; findData.FileSizeLow = 0U; bool flag3; do { if (this.m_safeFindHandle == null) { string fileName = Path.Combine(this.m_path.FullName, filter); this.m_safeFindHandle = NativeMethods.FindFirstFile(fileName, out findData); if (this.m_safeFindHandle == null || this.m_safeFindHandle.IsInvalid) { flag3 = false; int lastWin32Error = Marshal.GetLastWin32Error(); if (lastWin32Error != 2) { this.ThrowIOException(lastWin32Error, "FindFirstFile"); } } else { flag3 = true; } } else { flag3 = NativeMethods.FindNextFile(this.m_safeFindHandle, out findData); if (!flag3) { int lastWin32Error2 = Marshal.GetLastWin32Error(); if (lastWin32Error2 != 18) { this.ThrowIOException(lastWin32Error2, "FindNextFile"); } } } if (flag3) { if ((findData.FileAttributes & NativeMethods.FileAttributes.Directory) != NativeMethods.FileAttributes.None && !this.IsSpecialDirectoryName(findData.FileName) && (extendedFilter == null || extendedFilter(findData))) { flag2 = true; } switch (enumType) { case DirectoryEnumerator.EnumerationType.Files: if ((findData.FileAttributes & NativeMethods.FileAttributes.Directory) == NativeMethods.FileAttributes.None && NativeMethods.PathMatchSpec(findData.FileName, filter)) { flag = true; } break; case DirectoryEnumerator.EnumerationType.Directories: if (flag2) { flag = true; } break; case DirectoryEnumerator.EnumerationType.FilesOrDirectories: if (flag2) { flag = true; } else if ((findData.FileAttributes & NativeMethods.FileAttributes.Directory) == NativeMethods.FileAttributes.None && NativeMethods.PathMatchSpec(findData.FileName, filter)) { flag = true; } break; } if (this.m_recurse && flag2) { this.m_realDirectories.Add(findData.FileName); } if (flag && extendedFilter != null && !extendedFilter(findData)) { flag = false; } } }while (flag3 && !flag); if (flag) { if (this.ReturnBaseNames) { itemName = findData.FileName; } else { itemName = Path.Combine(this.m_path.FullName, findData.FileName); } } else { this.ResetFindHandle(); } return(flag); }
private bool GetNextItem(string filter, DirectoryEnumerator.EnumerationType enumType, out string itemName) { NativeMethods.WIN32_FIND_DATA win32_FIND_DATA; return(this.GetNextItem(filter, enumType, out itemName, out win32_FIND_DATA, null)); }